# Installationspfad



## someone2449 (4. Jun 2012)

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?


----------



## Gast2 (4. Jun 2012)

Warum musst du denn den Installationspfad kennen?


----------



## someone2449 (4. Jun 2012)

EikeB hat gesagt.:


> Warum musst du denn den Installationspfad kennen?



Um auf Dateien zuzugreifen, die dort liegen.


----------



## Gast2 (4. Jun 2012)

Machs relativ!

Uniform Resource Locator ? Wikipedia


----------



## maki (4. Jun 2012)

> 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?


----------



## someone2449 (4. Jun 2012)

maki hat gesagt.:


> 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.


----------



## someone2449 (4. Jun 2012)

kappesf hat gesagt.:


> Machs relativ!



Hast du ein Beispiel? Kann ich mit 
	
	
	
	





```
new URL("#include")
```
 eine URL auf den Ordner "include", der im Installationsordner (wie das Binary) liegt, erzeugen?


----------



## maki (4. Jun 2012)

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.


----------



## someone2449 (4. Jun 2012)

maki hat gesagt.:


> 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.


maki hat gesagt.:


> 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.


maki hat gesagt.:


> 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.


----------



## maki (4. Jun 2012)

> 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.


----------



## someone2449 (4. Jun 2012)

maki hat gesagt.:


> 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.


----------

