Start und 'Programm'-Verzeichnis

Von: , Frage gestellt am Fr, 12. Sep 2003

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

8 Antworten zu dieser Frage

  1. Antwort von nach 7 Stunden 0 hilfreich
    Re: Start und 'Programm'-Verzeichnis

    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

    • Antwort von nach einem Tag 0 hilfreich
      Re^2: Start und 'Programm'-Verzeichnis

      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

  2. Antwort von nach einem Tag 0 hilfreich
    Re: Start und 'Programm'-Verzeichnis

    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

    • Antwort von nach einem Tag 0 hilfreich
      Re^2: Start und 'Programm'-Verzeichnis

      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

      • Antwort von nach einem Tag 1 hilfreich
        Re^3: Start und 'Programm'-Verzeichnis

        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

        • Antwort von nach 2 Tagen 0 hilfreich
          Re^4: jar-Dateien finden

          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 <code>null</code> 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 <code>null</code> 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

  3. Antwort von nach einem Tag 1 hilfreich
    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:

    <snip>
    String ResourceName="Test.class";
    String myCoolFoundPath = this.getClass().getClassLoader().getResource(resourceName).toString();
    System.out.println(myCoolFoundPath);
    </snip>

    mfG,

    J.P.Jarolim

    • Antwort von nach einem Tag 1 hilfreich
      Ah - zu spät lol

      Kommt davon, wenn man die Threads nicht anschaut - Hattest du eh schon die Antwort lol.

      mfG,

      J.P.Jarolim

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!