2009-08-18 13 views
2

Ich habe eine ausführbare JAR-Datei. Einmal gestartet, kann man nur stoppen, indem man zum Task-Manager geht und den Java-Prozess beendet. Gibt es einen saubereren Weg, um es zu stoppen, sagen Sie mit einer Benutzeroberfläche, die ein unerfahrener Benutzer verwenden kann?Stoppen einer ausführbaren JAR-Datei

+0

Haben Sie Zugriff auf den Code oder ist dies eine Anwendung von Drittanbietern? –

+0

Ich habe die ganze Anwendung gemacht, also ja, ich habe Zugriff auf den Code. –

Antwort

1

Da Sie den Code steuern, möchten Sie etwas in der GUI haben, das das Beenden mit System.exit ermöglicht. Also, wenn Sie Schwingen verwenden, könnten Sie so etwas wie:

JButton b = new JButton("Exit"); 
b.setActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent e) { 
    System.exit(0); 
    } 
} 
+0

Nun, das Problem ist, dass es keine GUI-Anwendung gibt, wo ich eine Schaltfläche setzen kann. Ich könnte eine andere GUI-Anwendung machen, um mein jar zu stoppen, aber diese GUI würde auf einem anderen jvm arbeiten, so dass sie möglicherweise nicht mit der anderen Anwendung interagieren kann. –

1

Eine weitere nützliche Technik für window zu hören ist, was passiert, wenn der Benutzer die X-Taste auf Windows klickt (und das Äquivalent auf anderen Systemen):

addWindowListener(new WindowAdapter() { 
    public void windowClosing(WindowEvent e) { 
     System.exit(0); 
    } 
}); 

Normalerweise setze ich das im Konstruktor der Klasse, die Frame für die Anwendung erweitert.

Wenn Sie eine JFrame verwenden, müssen Sie auch diese Zeile hinzufügen:

setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); 
+0

Oder Sie könnten 'setDefaultCloseOperation (WindowConstants.EXIT_ON_CLOSE) 'tun und den zusätzlichen' WindowListener' vermeiden. –

+0

Nun das Problem damit ist, dass es keine GUI-Anwendung gibt, wo ich eine Schaltfläche setzen kann. Ich könnte eine andere GUI-Anwendung machen, um mein jar zu stoppen, aber diese GUI würde auf einem anderen jvm arbeiten, so dass sie möglicherweise nicht mit der anderen Anwendung interagieren kann. –

+0

Wahr, aber manchmal müssen Sie etwas aufräumen, damit Sie keine Kontrolle über diesen Weg haben. – Jonathan

0

Wenn Ihre Anwendung keine GUI haben - zum Beispiel, wenn es ein Service - dann können Sie zu den lokalen Netzwerkzugang nutzen Simulieren Sie die Standard-IPC-Mechanismen (InterProcess Communication), die das Betriebssystem normalerweise zum Starten und Stoppen von Diensten verwendet.

Eine sehr beliebte Implementierung, dass Sie in Apache Commons Daemon Projekt finden Sie unter: http://commons.apache.org/daemon/

+0

Ich habe launch4J verwendet, um meine jar in eine exe einzupacken, aber ich möchte, dass es als Dienst funktioniert, ich habe versucht, Java Service Wrapper, aber es funktioniert nicht für mich aus irgendeinem Grund. Ich werde in deinen Link schauen. Aber ab sofort ist meine Bewerbung kein Service. –

+0

Ob es ein Dienst ist oder nicht, wenn es keine Benutzerschnittstelle gibt, dann ist der beste Weg, dies zu kontrollieren, der lokale Netzwerkzugriff. Öffnen Sie einen abhörenden Socket, der nur Verbindungen vom lokalen Rechner akzeptiert, und warten Sie, bis die Befehle in einem separaten Thread ankommen. – Jonathan

+0

Commons Daemon hat das bereits für Sie implementiert - sie stellen sowohl den "Server" als auch den "Client" für diese Methode bereit. – Guss

0

Ihre Anwendung wird beendet, wenn alle Nicht-Daemon-Threads beendet. Eine Möglichkeit, dies zu tun, wäre, alle Threads außer einem Daemon zu machen, und der letzte Thread wäre derjenige, der das Signal zum Stoppen erwartet.

0

Ich habe endlich die Lösung für mein Problem gefunden. Da ich keine GUI habe, die ich schließen kann, habe ich auch keine Konsole. Der beste Weg ist die Verwendung der SystemTray API im Paket java.awt. Klicken Sie einfach mit der rechten Maustaste auf das Symbol und beenden Sie es.

Verwandte Themen