Installationspfad

S

someone2449

Gast
Hallo,

erneut bitte ich dieses Forum um Hilfe (muss mir endlich mal einen Account erstellen):

Ich schreibe eine Java-Anwendung, bei der ich wissen muss, wo die Binaries installiert / entpackt sind, sprich wo der Installationspfad ist.
Leider kennt Java kein %0, argv[0] usw., daher muss ich den Pfad auf andere Wege beziehen. Meine Ideen wären
1. eine Umgebungsvariable (effizient, Programm muss aber installiert sein, plattformunabhängig?),
2. die Verwendung einer der bekannten Methoden, um den Pfad der class- / jar-File herauszubekommen (kenne keine effiziente, zuverlässige, plattformunabhängige, die ggf. auch im Wrapper (JET-Compiler) funktioniert)
oder
3. ein kleiner C/C++ Wrapper, der die Java-Anwendung mit Installationspfad als Argument aufruft.

Kennt ihr weitere Methoden? Welche würdet ihr nutzen? Gibt es doch einen Weg, an den Pfad, der aufgerufen wurde, zu kommen?
 
M

maki

Gast
2. die Verwendung einer der bekannten Methoden, um den Pfad der class- / jar-File herauszubekommen (kenne keine effiziente, zuverlässige, plattformunabhängige, die ggf. auch im Wrapper (JET-Compiler) funktioniert)
Schon mal [c]new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath())[/c] probiert?
 
S

someone2449

Gast
Schon mal [c]new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath())[/c] probiert?

Natürlich, davon sprach ich. Ich glaube jedoch nicht, dass das auch bei gewrappten Anwendungen funktioniert. Und so viel, wie solche Funktionen diskutiert wurden, bin ich mir auch wegen der Zuverlässigkeit auf unterschiedlichen Plattformen unsicher.
 
M

maki

Gast
Du hast es also nicht probiert.... das mit dem Wrapper würde ich testen, sehe nicht warum das nciht laufen sollte.
Wobei JET kein Wrapper ist, sondern ein Ahead of Time Compiler (schneller sollte es dadurch übrigens nicht werden), und es ist eben keine JVM.

Das funzt übrigens sehr gut unter unterschiedlichen Plattformen, habs selber schon probiert (Windows XP, Windows 7 32/64, linux 32/64 bit, alles kein Problem), wichtig ist nur dass man die Berechtigung dafür hat und der SecurityManager einem keinen Strich durch die Rechnung macht.
 
S

someone2449

Gast
Du hast es also nicht probiert.... das mit dem Wrapper würde ich testen, sehe nicht warum das nciht laufen sollte.
Tut mir leid, mein Handy hat zur Zeit keinen vollständig funktionstüchtigen Java-Compiler und Wrapper-Generator installiert.
Wobei JET kein Wrapper ist, sondern ein Ahead of Time Compiler (schneller sollte es dadurch übrigens nicht werden), und es ist eben keine JVM.
Nun gut, damit stehen einige VM-Funktionen nur eingeschränkt zur Verfügung. Auf dieses Problem bezogen sehe ich aber keinen Unterschied zum gewrappten Programm, dass ohne Extraktion läuft.
wichtig ist nur dass man die Berechtigung dafür hat und der SecurityManager einem keinen Strich durch die Rechnung macht.
Daran habe ich schon gedacht. Eine (bei einem normalen Programm eher unwahrscheinliche) Exception hier bedeuted allerdings in meinem Fall einen fatalen Fehler.

Danke, werds gleich mal ausprobieren.
 
M

maki

Gast
Eine (bei einem normalen Programm eher unwahrscheinliche) Exception hier bedeuted allerdings in meinem Fall einen fatalen Fehler.
Naja, einen SecurityManager hat man ja nicht zufällig am laufen.
Eben bei Applets ist einer Aktiv (aber das der Pfad der Jar eh egal), auf Servern wie Tomcat, Glassfish, JBoss etc. ist auch normalerweise einer aktiv, aber auch da gibt es entweder andere Wege oder est macht schlicht keinen Sinn sich nach dem Pfad der "Jar" zu erkudingen.

Was hast du denn eigentlich vor?
Willst du dorthin was schreiben, oder nur config auslesen?
Beim schreiben kannst du schon unter Win 7 Probleme bekommen, je nachdem wohin die Anwednugn installiert wurde.
 
S

someone2449

Gast
Was hast du denn eigentlich vor?
Willst du dorthin was schreiben, oder nur config auslesen?
Beim schreiben kannst du schon unter Win 7 Probleme bekommen, je nachdem wohin die Anwednugn installiert wurde.

Ich habe zwei Pfade. Zunächst den Installationspfad, in dem auch globale Einstellungen und eingebundene Tools liegen. Schreibrechte sind nicht gesetzt, wird also nur lesend genutzt. Außerdem einen benutzerspezifischen Ordner, in dem lokale Einstellungen und Skripte liegen. Dieser wird auch für Statusdateien genutzt, also auch schreibend.
 

Oben