PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Application path zur Laufzeit bestimmen



Qudus
31-08-2005, 17:26
hi

Ich habe ein normales Java-Programm (in einem jar). Wie kann ich zur Laufzeit feststellen, in welchem Pfad das Programm installiert ist? Ich meine nicht das aktuelle Verzeichnis (PWD/CWD) sondern den Pfad, in dem das jar liegt.

Gruß, Qudus

peschmae
31-08-2005, 18:28
Soviel ich weiss geht das gar nicht. Wozu würdest du denn sowas benötigen?

MfG Peschmä

Qudus
31-08-2005, 18:56
Ich lese Konfigurationsdateien aus, die in einem Verzeichnis neben dem jar liegen. Wenn ich das Programm nun über ein Skript starte (bzw. über einen Link auf dieses Skript unter /usr/local/bin), kann das Programm diese Daten nicht mehr finden, da PWD auf dem Verzeichnis steht, wo ich das den Link (das Skript->das jar) gestartet habe.

Ich will die configs nicht unter /etc oder so legen, da ich dieses Konzept nicht gut finde. Ich finde, eine Anwendung muss in sich geschlossen sein. Daher will ich ein Verzeichnis haben, in dem alles liegt, was das Programm selbst mitbringt und braucht. Außerdem hätte ich auch keine Ahnung, wo sowas unter Win hinzulegen wäre. C:\Windows\System32 oder so wahrscheinlich. Ist aber alles scheiße.

Naja, das ist der Grund.

Als ich nach dem Problem gegoogled habe, bin ich auf ein paar Seiten gekommen, wo der Pfad für Applets ausgelesen wurde. Dafür scheint es zu gehen.

Qudus

bischi
31-08-2005, 19:03
Aber du kannst in Java ja relative Pfade angeben!

MfG Bischi

anda_skoa
31-08-2005, 20:00
Relative Pfade sind relativ zum aktuellen Arbeitsverzeichnis.

Man könnte vielleicht den Classpath auslesen und dann in den Pfaden nach dem eigenen .jar suchen.

Allerdings ist es fraglich ob es eine gute Idee ist, sich so ganz anders als native Applikationen zu verhalten.
Vielleicht gibt es ja eine Java Config API

Ciao,
_

Lin728
31-08-2005, 21:41
"In sich geschlossene" Anwendungen haben den gravierenden Nachteil, nicht mehrbenutzerfähig zu sein was vielen Administratoren die Haare zu berge stehen lässt.

In /etc kommen sowieso nur System-specifische Sachen rein, aber wie wärs im home-verzeichnis des aktuellen Benutzers? Da gehört sowas auch normalerweise hin ;-)

Qudus
31-08-2005, 23:22
"In sich geschlossene" Anwendungen haben den gravierenden Nachteil, nicht mehrbenutzerfähig zu sein was vielen Administratoren die Haare zu berge stehen lässt.

Wenn das System von mehreren Benutzern verwendet werden sollte, würde ich Dir recht geben. Wird es aber unter Garantie nicht. Und da will ich doch lieber die Vorteile einer in sich geschlossenen Anwendung mitnehmen als die Nachteile der multi-user fähigen Anwendung akzeptieren zu müssen.


In /etc kommen sowieso nur System-specifische Sachen rein, aber wie wärs im home-verzeichnis des aktuellen Benutzers? Da gehört sowas auch normalerweise hin ;-)

Naja, bei diesem Programm ist nur eine Einstellung sinnvoll (soweit ich es plane) und die sollte dann systemweit gelten. Also wäre in diesem Fall das home-Verzeichnis unsinn.

So habe ich das Problem für mich gelöst:


private static String getApplicationPath(String programName)
{
programName += ".jar";

String pathSep = System.getProperties().getProperty("path.separator");

String[] classPath = System.getProperties().getProperty("java.class.path").split(pathSep);
for (String cp: classPath)
{
if (cp.endsWith(programName))
return(cp.substring(0, (cp.length() - programName.length())));
}

String pwd = (System.getProperties().getProperty("user.dir") + System.getProperties().getProperty("file.separator"));
return(pwd);
}


der Parameter programName muss separat ermittelt werden. Ich mache das über den Namen der main-Klasse. Das stimmt sicherlich nicht bei jedem Programm, aber für mich passt es erstmal. Aber irgentwie finde ich, dass Java soetwas wie ich hier gebaut habe, vorsehen sollte. Das brauchen sicherlich andere auch.

anda_skoa
02-09-2005, 13:21
Naja, bei diesem Programm ist nur eine Einstellung sinnvoll (soweit ich es plane) und die sollte dann systemweit gelten. Also wäre in diesem Fall das home-Verzeichnis unsinn.

Man könnte dann diese Einstellung als Parameter übergeben oder den Pfad zur Konfigurationsdatei.
Aber wenn du es ohnehin nur privat verwendest, könntest du die Config auch in das Jar Bundle mit rein nehmen.


Aber irgentwie finde ich, dass Java soetwas wie ich hier gebaut habe, vorsehen sollte. Das brauchen sicherlich andere auch.

Das würde vermutlich der Idee im Java Design widersprechen, weil es erstens eine starke zusätzliche Koppelung von Code auf externe Repräsentatione gäbe und andererseits das Resourcen Konzept offenläst, von wo Sachen geladen werden

Von API aus der Standard Class Lib erwarten Entwickler normalerweise, daß sie nicht nur in Spezialfällen wie lokalen Jar Dateien funktioniert.

Ciao,
_

fs111
06-09-2005, 23:13
Viele Java Applikationen machen das auch über Umgebungsvariablen, wi z.B. der tomcat oder ArcExplorer von esri. Die werden in einem Shellskript zum starten gesetzt, und dann im Programm wieder ausgelesen.

fs111