tach zusammen.
Wenn ich eine Javaanwendung (in einem .jar-Archiv) starte, ist in den meisten Fällen das Verzeichnis mit der jar-Datei auch das aktuelle Verzeichnis. Es gibt allerdings auch Fälle in denen das „Startverzeichnis“ nicht das mit der .jar-Datei ist. Wie bekomme ich trotzdem das „Programmverzeichnis“ der jar-Datei heraus?
Beispiel:
Das .jar-Archiv app.jar liegt in c:\projekte\
befinde ich mich in diesem Verzeichnis und starte das Archiv mit
java -jar app.jar
ist alles in Ordnung.
Befinde ich mich in z.B. dem Verzeichnis C:\temp und starte das Archiv mit
java -jar C:\projekte\app.jar
ist mein Startverzeichnis nicht mehr das mit der .jar-Datei. Aber genau dieses Verzeichnis hätte ich gerne gewußt.
Gruss Jens
Hi.
Was probierenswert wäre: Mach doch mal per java.io.File das derzeitige Verzeichnis (aus Sicht der Applikation) auf und schau nach, welches das ist.
mfG,
J.P.Jarolim
Hallo,
schau’ mal in die Manifest-Datei des Jars (jar xf xyz.jar META-INF/MANIFEST.MF). Dort sind sicher einige jars im „Class-Path“ angegeben (evtl. als relativer Pfad). Anhand derer Position läßt sich auf das Startverzeichnis des ausführbaren Jars schließen.
Gruss
Enno
Hi J.P
Was probierenswert wäre: Mach doch mal per java.io.File das
derzeitige Verzeichnis (aus Sicht der Applikation) auf und
schau nach, welches das ist.
Das Startverzeichnis. Das war mir schon bekannt. Aber das ist nicht das was ich suche. Ich möchte zur Laufzeit das „Programmverzeichnis“ haben.
Gruss Jens
Hi Enno
schau’ mal in die Manifest-Datei des Jars (jar xf xyz.jar
META-INF/MANIFEST.MF). Dort sind sicher einige jars im
„Class-Path“ angegeben (evtl. als relativer Pfad). Anhand
derer Position läßt sich auf das Startverzeichnis des
ausführbaren Jars schließen.
Das funktioniert leider nicht zur Laufzeit des Jars. Wenn ich eine test.jar starte möchte ich zur Laufzeit dieser jar-Datei gerne wissen in welchem Verzeichnis sich diese jar-Datei befindet.
Die manifest.mf ist mit bekannt. Aber daraus läßt sich meines Wissens nicht die Position des eigenen jar-Archivs (zur Laufzeit !!) ermitteln 
Gruss Jens
Hallo,
ein Hack wäre es sich die URL einer im Jar definierten Resource zu holen, z.B. das Class-File der Main-Class. Bsp.:
Manifest unter META-INF/MANIFEST.MF anlegen:
Manifest-Version: 1.0
Created-By: 1.4.1-beta (Sun Microsystems Inc.)
Main-Class: Test
File Test.java:
public class Test
{
public static void main(String[] args)
{
System.out.println(
Test.class.getClassLoader().getResource("Test.class").getFile()
);
}
}
Übersetzen und packen & ausführen:
javac Test.java
jar cmvf META-INF/MANIFEST.MF Test.jar Test.class
java -jar Test.jar
Als Ausgabe bekomme ich:
file:/home/user1/sandner/TT/Test.jar!/Test.class
wird Test.jar an einer anderen Stelle gestartet, ändert sich der Pfad entsprechend. Evtl. hilft Dir das weiter.
Gruss
Enno
1 „Gefällt mir“
found it
So - Nach ein bissale suchen:
Ausgehend von der Annahme, das du ein File „Test.class“ im root des jar’s liegen hast, könntest du folgendes ausprobieren:
String ResourceName=„Test.class“;
String myCoolFoundPath = this.getClass().getClassLoader().getResource(resourceName).toString();
System.out.println(myCoolFoundPath);
mfG,
J.P.Jarolim
Ah - zu spät lol
Kommt davon, wenn man die Threads nicht anschaut - Hattest du eh schon die Antwort lol.
mfG,
J.P.Jarolim
Hi Enno
Danke für den Hinweis. Ich habe mal etwas weiter gesponnen und 'nen kleine Klasse dazu gemacht:
package de.nigjo.util;
import java.io.File;
import java.net.URL;
/\*\* liefert die Position des .jar-Archives in dem sich eine Klasse befindet.
\*
\* @author nigjo
\*/
public class JarSearcher
{
private Class searchClass;
public JarSearcher()
{
}
public static File getJar(Object obj)
{
JarSearcher searcher = new JarSearcher();
searcher.setClass(obj.getClass());
return searcher.findJar();
}
/\*\* liefert das File-Objekt der .jar-Datei.
\*
\* @return null wenn Klasse nicht in einer .jar-Datei ist
\*/
private File findJar()
{
String klasse = getClassURL().getFile();
if (klasse.indexOf(".jar!") \>= 0)
{
String jar = klasse.substring(0, klasse.indexOf(".jar!") + 4);
return new File(jar);
}
// keine jar-Datei gefunden.
return null;
}
private URL getClassURL()
{
String name = searchClass.getName();
name = name.replaceAll("\\.", "/");
return searchClass.getClassLoader().getResource(name + ".class");
}
private void setClass(Class toSearch)
{
searchClass = toSearch;
}
/\*\* liefert das Verzeichnis der jar-Datei, in dem sich die Klasse zum
\* angegebenen Objekt befindet.
\*
\* @param obj
\* @return null wenn Klasse nicht in einer .jar-Datei ist.
\*/
public static File getJarDirectory(Object obj)
{
// suche Jar-Datei
File jar = getJar(obj);
if (jar != null)
{
// jar-Datei gefunden.
return jar.getParentFile();
}
// jar-Datei nicht gefunden
return null;
}
}
Gruss Jens