Wie erfahre ich den Programmnamen und das Verzeichnis, in dem es sich befindet?

Wie erfahre ich den Programmnamen (des ausgeführten Programms) und das Verzeichnis, in dem es sich befindet?

Die einfachste Lösung schien zu sein, den String unterSystem.getProperty("sun.java.command")zu verarbeiten.

Nun muß ich aber herausfinden, ob die Datei die gestartet wurde, eine .class-Datei oder eine .jar-Datei ist. (Bei einer .class-Datei muß ich die Endung noch anfügen, bei einer .jar-Datei nicht).

Anfangs dachte ich, daß eine Jar-Datei immer ein “.jar” am Ende hat. Doch dann stieß ich auf Windows .exe-Dateien, die man als zip-Order öffnen kann und ebenfalls als ausführbare *.jar-Dateien diesen.

Besonders schlimm wird z.B. folgendes unter Windows:
Ich starte das Programm unter C:\ mit

java -jar "Dokumente und Einstellungen\User\uu\TheProgram\TheProgram.exe" hzu\fe\dffw wffe/wdwd/dw /? fwfe

und System.getProperty(“sun.java.command”) gibt mir dann folgendes aus:

Dokumente und Einstellungen\User\uu\TheProgram\TheProgram.exe hzu\fe\dffw wffe/wdwd/dw /? fwfe

(also ohne die Anführunszeichen, die lediglich die Eingabeaufforderung für ihre Verarbeitung brauchte).
Splitte ich nach Leerzeichen, dann erhalte ich mitten im String-Array ein unnützes “Einstellungen\User\uu\TheProgram\TheProgram.exe”.
Splitte ich nach System.getProperty(“file.separator”) (unter Windows ist es Backslash), dann erhalte ich mitten im String-Array ein ebenso unnützes “TheProgram.exe hzu”.

Und wenn mein Programm nicht “TheProgram.exe” heißt, sondern “The Pr.o.gram.exe”, dann wird das Problem noch etwas größer.

Mit anderen Worten:
System.getProperty(“sun.java.command”) ist nicht zu gebrauchen, um den Programmnamen und das Verzeichnis in dem es sich befindet auszulesen.

Die Methode, die das aufgerufene Programm und separat das Verzeichnis, indem es sich befindet, anzeigen soll, ist in einer externen Bibliothek.
Das heißt, das Verzeichnis dieser Bibliothek und das des aufgerufenen Programms, ist nicht immer das selbe.
Somit hilft auch etwas wiegetClass().getProtectionDomain().getCodeSource().getLocation().toURI().getPath()nicht gerade weiter, da es dann bloß das Verzeichnis der Bibliothek anzeigt.

Gibt es somit irgendeine Möglichkeit den Namen des ausgeführten Programms auszulesen? Und separat das Verzeichnis auszulesen, in dem sich das Programm befindet?

Grüße
theuserbl

Auch auf die Gefahr hin, dass dir das nicht gefällt: wozu willst du das machen?

Ich frage nur, weil das was du da willst - aus vielerlei Gründen - eigentlich vermieden werden soll -

Ansonsten getCodeSource() - aber du das wirklich willst ist fraglich…http://stackoverflow.com/questions/320542/how-to-get-the-path-of-a-running-jar-file

[QUOTE=Bleiglanz]Auch auf die Gefahr hin, dass dir das nicht gefällt: wozu willst du das machen?[/QUOTE]Weil es gewissermaßen zur Implementierung einer bestimmten Bibliothek gehört. (ebenfalls auf die Gaefahr hin, daß Dir die Antwort nicht ausreicht)

Ansonsten getCodeSource()

Ja, aber dann muß ich ja schon wissen, wie die Class-Datei heißt, die gestartet wurde. Das weiß ich aber nicht vorher.

schlimm wäre ja ein Programmaufruf
"\directory\X .exe .exe .exe" .exe .exe
oder so :wink:

was ich bisher schon ganz schnell gefunden habe ist

mit Auflistung der Parameter über

  List<String> aList = bean.getInputArguments();

dann sollte es leichter sein, den Rest aus dem command zu bestimmen, damit hast du quasi die Anführungszeichen drumherum,
Auftrennen nach Verzeichnis/ Dateiname über letzten Slash,
im Dateiname gehören Leerzeichnen dazu,
Verzeichnisse weiter nach Slash aufteilen, Leerzeichen gehören auch jeweils dazu

Danke, Slater. Werde ich mir mal näher ansehen.

Grüße
theuserbl

*** Edit ***

Habe es nun getestet. Das hilft auch nicht weiter.

Wenn ich

java -Dswing.systemlaf=javax.swing.plaf.metal.MetalLookAndFeel -jar "Dokumente und Einstellungen\User\uu\TheProgram\TheProgram.exe" hzu\fe\dffw wffe/wdwd/dw /? fwfe -eigenesArgument 10

eingebe, dann wird mir durch Dein Programmcode folgendes zurückgegeben:

-Dswing.systemlaf=javax.swing.plaf.metal.MetalLookAndFeel

Das heißt, es wird nur das angezeigt, was als Argument direkt an die JavaVM gerichtet ist.

Das wurde durch einSystem.getProperty("sun.java.command")aber sowieso nie angezeigt. Denn das zeigt hierbei

Dokumente und Einstellungen\User\uu\TheProgram\TheProgram.exe hzu\fe\dffw wffe/wdwd/dw /? fwfe -eigenesArgument 10

an. Also alles andere.

Grüße
theuserbl

Mal ehrlich:

Windows/Unix/Mac/Android
.class oder .jar, ein groovy script :slight_smile:
Reflection und dynamische Classloader
Webstart (jemand startet ein Programm das deine Bibliothek über http nachlädt…)
usw. usf.

Kannst du nicht mal kurz die Funktion beschreiben für die du die ziemlich schwer zu definierenden „Name des Programms“ und „Verzeichnis in dem sich das Programm befindet“ auswerten willst?