Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Auf Datei im Dateisystem aus einem jar-Archiv zugreifen
ich habe ein Package "com.mycompany.mytool" welches ich in eine .jar-Datei gepackt habe und es ist ein ausführbares Programm. Jetzt will ich, dass das Tool eine Datei öffnet, die aber nicht in das jar-Archiv mitgepackt ist, sondern einfach im Dateisystem liegt. Sagen wir, im demselben Ordner, wie die jar-Datei. Klappt irgendwie nicht. Was muss ich als Pfad zur Datei angeben?
Du hast keine 100%ige Möglichkeit in jedem Fall wirklich immer an das "Installationsverzeichnis" des JARs zu kommen. In fast allen Fällen sollte jedoch das hier funktionieren Back to your Class roots - JavaWorld
Ich benutze in meinen Programmen immer ein Konstrukt in dieser Art. Ist hingehackt und vermutlich kann man das noch etwas optimieren. Aber als es mal tat, hatte ich keine Lust mehr dazu.
Übergeben muß man ein Objekt der Anwendung, z.B. das Hauptfenster der Anwendung, eine Instanz der Hauptklasse o.ä.
Hauptsache die Klasse wurde aus dem Jar geladen.
Java:
public static void init(final Object c) {
// extract path of JAR from the class name
// needed to store ini file in the same folder as the JAR
// note: during development, the path is the path of the main class
if (c != null) {
// only executed in GUI part
String s = c.getClass().getName().replace('.','/') + ".class";
URL url = c.getClass().getClassLoader().getResource(s);
int pos;
try {
fnameProps = URLDecoder.decode(url.getPath(),"UTF-8");
} catch (UnsupportedEncodingException ex) {};
if (( (pos=fnameProps.toLowerCase().indexOf("file:")) != -1))
fnameProps = fnameProps.substring(pos+5);
if ( (pos=fnameProps.toLowerCase().indexOf(s.toLowerCase())) != -1)
fnameProps = fnameProps.substring(0,pos);
// special handling for JAR
s = ToolBox.exchangeSeparators(fnameProps.toLowerCase());
pos = s.lastIndexOf(".jar");
if (pos != -1) {
pos = s.substring(0,pos).lastIndexOf('/');
if (pos != -1)
fnameProps = fnameProps.substring(0,pos+1);
}
fnameProps += "loadMe.ini";
// fnameProps now contains the absolute path of file "loadMe.ini"
...
}
Der Vorteil ist, daß das sowohl im Jar als auch während der Entwicklung ohne Jar funktioniert. Falls die übergebene Klasse aus dem Jar geladen wurde, kommt am Ende der Pfad heraus, in dem die Jar liegt. Wurde die Klasse direkt geladen, kommt der Pfad heraus, von dem die Klasse geladen wurde.
Funktioniert meines Wissens unter jedem OS (MacOS, Linux und Windoof) und auch für Webstart-Anwendungen.