Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ich will dass mein Jar erkennt ob's schon gestartet ist und wenn dem so ist den Fokus auf das Fenster setzt.
Letzteres ist noch so wichtig aber ich will wissen ob es bereits läuft, damit mans nicht zweimal starten kann.
Ich weiss leider nicht wonach ich da suchen müsste.
Normalerweise könnte man abfragen was für Tasks offen sind oder welche Prozesse laufen, und schauen, ob das eigene Programm dabei ist. Aber bei Java weiss ich nicht wie das geht, da läuft ja die VM. Und es soll auch systemunabhängig sein.
Ich dachte es geht vielleicht mit einem File-Lock, aber es muss Systemunabhängig sein und so viel ich weiss hat's bei Windows bereits einen Lock während dies bei Unix & co. nicht der Fall ist.
Kann ich irgendwie sowas wie ein Mutex-Objekt erstellen das über alle VMs verfügbar ist? Scheint mir eher unwahrscheindlich. Aber wie sonst kann ich wissen ob ein jar schon läuft?
Oder kann man das vielleicht ganz einfach im Manifest so definieren? Ich hab in den Spezifikationen aber nichts dergleichen gefunden.
Danke für die rasche Antwort. Das mit dem Server ist mir etwas zu viel. Meine Kunden fänden das vermutlich auch nicht so lustig wenn ich da einfach Ports aufmache.
Ich hab's jetzt mit einem simplem FileLock gelöst.
Hab's auf Win2k und Mac OS X getestet. Scheint gut zu funktionieren.
Es geht auch wenn man die VM killt. Dann existiert die Datei zwar noch aber der FileLock nicht mehr.
Code:
public class AppMutexCheck {
/** Lock auf das File. Ist static damit es bis zum Programmende bestehen bleibt. */
static FileLock lock = null;
/** Channel vom File. Ist static damit es bis zum Programmende bestehen bleibt. */
static FileChannel fc = null;
/** Stream aufs File. Ist static damit es bis zum Programmende bestehen bleibt. */
static FileOutputStream fos = null;
/***
* Erstellt eine Datei und setzt einen file lock.
* Falls dies nicht gelingt hat schon eine andere App dies getan.
* Wenn was schief geht wird false zurückgegeben damit die Applikation im
* Zweifelsfall trotzdem gestartet wird.
*
* @param name ID der Applikation = Dateiname für Lock-Datei
* @return true wenn schon eine andere Applikation läuft, sonst false
* @author Claude Martin
*/
static public boolean isOtherInstanceRunning(String name) {
try {
String path = System.getProperty("java.io.tmpdir") + "/" + name + ".lock";
File f = new File(path);
fos = new FileOutputStream(f);
fc = fos.getChannel();
lock = fc.tryLock();
if(lock == null) {
fc.close();
fos.close();
return true;
}
f.deleteOnExit();
return false;
} catch (Exception e) {
return false;
}
}
}
/////////////////////////////////////////////////////////////////
// Aufruf:
public class FooBar {
public static void main(String[] args) {
if(ETMutexCheck.isOtherInstanceRunning("FooBar")) {
System.out.println("Applikation \"FooBar\" ist bereits gestartet!");
System.exit(0);
}
// Weiterer Code ...
}
}