# Java Anwendung nur einmalig starten



## chalkbag (23. Mrz 2011)

Hallo Community,

ich hätte keine Frage zu einer Problemstellung, sondern möchte eher euch um eure persönliche Meinung bitten.

Grundproblem: Eine Java-Anwendung darf nur einmal gestartet werden


Laut Java Blog Buch : D) Java-Anwendung nur einmal ausführen
gibt es typischerweise 2 Lösungsansätze.

 - eine "Lockdatei" erstellen / löschen beim  starten / beenden
 - einen Port / Socket sperren 

Beide haben Vor-/Nachteile. Allerdings ist der Artikel schon relativ alt.

So die Frage, wie macht ihr das, was empfehlt ihr und natürlich warum?

Wäre, wenn ich eh schon Files wie Property-Files habe, der Lock nicht auch über dem Write-lock zu realisieren? An sich kann ich ja nur einmal die Datei im Schreibzugriff öffnen, wird der Zugriff (beim Absturz) dann automatisch wieder freigegeben?

Würd mich über eure Meinungen freuen

Grüße

Staubbeutel


----------



## diel2001 (23. Mrz 2011)

Oder ein Singleton draus machen und schon kann das Programm nur einmal pro VM gestartet werden


```
public class Test{

private static Test instance;

private Test(){}

public static Test getInstance(){
 if(instance == null){
 instance = new Test();
}
return instance;
}
}
```


----------



## Tomate_Salat (23. Mrz 2011)

wäre die 3te alternative.

schau mal hier im Forum, beliebt ist die Kombination aus beidem.


----------



## chalkbag (23. Mrz 2011)

Schonmal danke für die Antworten

Laut meinem Link



> ... Wenn in Java ein Programm allerdings zwei mal ausgeführt wird, starten beide Programme in einer unterschiedlichen Virtual Machine, weshalb mit gewöhnlichen Methoden nicht festgestellt werden kann, ob die Anwendung bereits läuft oder nicht. ...



Würde die Lösung von diel2001 ungeeignet machen? 

Bis Dato nutz ich eigentlich immer nur eclipse und ant um eine jars zu packen. Launch4J macht glaub ich eine exe drauß, welche dann kontrollieren kann ob es läuft oder nicht?


----------



## Tomate_Salat (23. Mrz 2011)

ne diel2001's Vorschlag taugt garnichts. Wäre auch katastrophal wenn es so wäre!

Jup Launch4J erstellt eine exe, hat aber den Nachteil, dass die Platformunabhängigkeit verloren geht.


----------



## chalkbag (24. Mrz 2011)

Danke Tomate_Salate,

dann wird es wohl auf das File und die Ports rauslaufen.

Schön das wir drüber gesprochen haben :applaus:


----------



## L-ectron-X (24. Mrz 2011)

http://www.java-forum.org/allgemeine-java-themen/114869-kein-doppelter-programmaufruf.html


----------



## nrg (24. Mrz 2011)

und was spricht mit einem stream auf den properties? der stream geht mit sicherheit beim beenden unter und im gegensatz zum klassischen filelock auch bei einem stromausfall oder unnatürlichen beenden der jvm. ausserdem ist das im gegensatz zum portlock nicht nur auf eine systemumgebung beschränkt.


----------



## Tomate_Salat (24. Mrz 2011)

Oder über NIO den FileLock:

```
import java.io.File;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;

import javax.swing.JOptionPane;


public class Demo 
{
	public final static String fileLock=System.getProperty("user.home")+File.separator+"frm.log";
	
	public static void main(String[] args) throws Exception
	{		
		FileChannel channel=FileChannel.open(Paths.get(fileLock),StandardOpenOption.WRITE,StandardOpenOption.CREATE);		
		FileLock fl=channel.tryLock();
		if(fl==null) {
			System.out.println("App is still running");
			System.exit(0);
		}
		
		JOptionPane.showMessageDialog(null, "MyUltimateApp");
	}
}
```


----------



## Tharsonius (25. Mrz 2011)

nrg hat gesagt.:


> und was spricht mit einem stream auf den properties? der stream geht mit sicherheit beim beenden unter und im gegensatz zum klassischen filelock auch bei einem stromausfall oder unnatürlichen beenden der jvm. ausserdem ist das im gegensatz zum portlock nicht nur auf eine systemumgebung beschränkt.



Ich habe die selbe Anforderung bei meinem Programm und dies bei mir mittels Socket gelöst. Klappt auch, aber Das mit dem Stream klingt interessant.

Kannst Du mir mal kurz erklären wie Du das meinst? Oder hast Du ein kleines Programmschnippsel parat?


----------



## chalkbag (25. Mrz 2011)

Auch wenn die Idee nicht von mir war,

er geht eben z.b. mit einem BufferedWriter auf das File los, und gibt das File sozusagen erst wieder zurück, wenn er fertig ist.

Wenn jetzt Instanz 2 auch versucht, schreibend auf die Datei zuzugreifen, wird dies mit einer entsprechenden Meldung untersagt.

Gelösst hab ich es jetzt wie von Tomate vorgeschlagen über das Lockfile, was wohl unterm Strich das gleiche machen sollte.

Mein Lockfile wurde bis jetzt automatisch immer wieder freigegeben, auch wenn ich vm etc. direkt ins Nirvana jage. Aber das sollte bei Dateizugriffe sicherlich ähnlich funktionieren.


----------

