*Markus: Jar-Files werden im Jar-Archiv nicht gefunden?

Hallo,

könnte mir vielleicht jemand bei meinem Mysterium helfen, denn ich bin mit meinen Weisheiten am Ende. Und zwar habe ich mehrere externe Bibliotheken als JAR-Archive, die ich mit all meinen Klassen in ein ausführbares Jar-Archiv packen will.
Ich habe hierzu sogar alle JARs und Klassen in ein Verzeichnis geschoben und packe das ausführbare JAR-Archiv mit folgendem Befehl und folgender Manifest-Datei:
Main-Class: Main
Class-Path: bcmail-jdk15-135.jar bcprov-jdk15-135.jar checkstyle-all-4.2.jar FontBox-0.1.0.jar junit.jar PDFBox-0.7.3.jar

$ jar cmf MainManifest.txt Verwaltung.jar *.class *.jar

Mit $ jar tf Verwaltung.jar wird folgendes angezeigt:

META-INF/
META-INF/MANIFEST.MF
DateiSpeicherung.class
Main.class
ProgrammGUI$1.class
ProgrammGUI.class
Reader.class
TelefonFileFilter.class
TelefonTableModel.class
YessOneReader.class
bcmail-jdk15-135.jar
bcprov-jdk15-135.jar
checkstyle-all-4.2.jar
FontBox-0.1.0.jar
junit.jar
PDFBox-0.7.3.jar

....und kann mir jetzt vielleicht jemand erklären wie es dazu kommt, dass ein Verschieben von Verwaltung.jar in ein anderes Verzeichnis dazu führt, dass all die mit reingepackten JAR-Archive nicht mehr gefunden werden? Eigentlich scheint es ja so, dass die JAR-Archive von "draußen" durch Verwaltung.jar referenziert werden, denn sowie sich Verwaltung.jar nicht mehr mit all den anderen Jar-Archiven in einem Verzeichnis befindet, können diese Bibliotheken nicht mehr aufgerufen werden.
Ich frage mich nun, was ich denn da oben gerade getan habe, denn ich sehe innerhalb von Verwaltung.jar eine Menge JAR-Archive? Werden die einfach ignoriert, oder wozu war das ganze sonst gut?

Markus

  1. Hallo,

    könnte mir vielleicht jemand bei meinem Mysterium helfen, denn ich bin mit meinen Weisheiten am Ende. Und zwar habe ich mehrere externe Bibliotheken als JAR-Archive, die ich mit all meinen Klassen in ein ausführbares Jar-Archiv packen will.

    Das geht so (ohne weiteres) nicht. Meines Wissens nach kann man die
    JARs im JAR nicht zum Classpath hinzufügen. Da hilft auch die Manifest-
    Datei nicht weiter.

    Du könntest aber einen eigenen Classloader entwickeln, der das doch
    kann. Oder du könntest die JARs vor der Auslieferung entpacken und dann
    zusammen mit deinen eigenen Klassen in das eine (dann große) ausführbare
    JAR-Archiv verpacken.

    Durch eine kurze Google-Suche habe ich noch diese Software gefunden:
    http://one-jar.sourceforge.net/
    Ich weiß aber natürlich nicht, ob die was taugt.

    Ansonsten könnte dir eine kurze Google-Suche nach "jar in jar" (inkl.
    Anführungszeichen) weiterhelfen. Damit habe ich auch die o.g. Seite
    gefunden.

    Gruß
    Slyh

    PS: Noch eine andere Anmerkung: Du solltest dringend dazu übergehen,
    deine Klassen in Packages abzulegen. Die Verwendung des  Default-Packages
    wird irgendwann zu gravierenden Problemen führen. Und zwar eher früher
    als später.

    1. Hallo,

      Oder du könntest die JARs vor der Auslieferung entpacken und dann
      zusammen mit deinen eigenen Klassen in das eine (dann große) ausführbare
      JAR-Archiv verpacken.

      Hierzu habe ich gerade noch ein Eclipse-Plugin gefunden, das wohl
      genau das beim Exportieren tut:
      http://fjep.sourceforge.net/

      Gruß
      Slyh

      1. Hallo,

        also mit der Tatsache, dass die JAR-Archive nicht miteingepackt werden können, kann ich mich abfinden, jetzt wo ich es weiß. Solange die Bibliotheken auch nur gefunden werden, ohne miteingepackt zu werden, kann ich damit leben.
        Danke für die Info, da hätte ich wohl lange probieren können, aber ich verstehe nicht, warum das so eigentlich nicht funktioniert.

        Markus

        1. Hallo,

          Danke für die Info, da hätte ich wohl lange probieren können, aber ich verstehe nicht, warum das so eigentlich nicht funktioniert.

          Es wird von Java bzw. der Java-API nicht unterstützt. Das kann zahlreiche
          Gründe habe. Den Grund kenne ich aber natürlich nicht.

          Im Prinzip funktioniert es aber ja eben doch, nämlich indem man einen
          eigenen ClassLoader schreibt, der das Hinzufügen von Klassen in JARs
          (in JARs) zum Classhpath erlaubt. Das ist übrigens gar nicht so schwer.
          Der dafür notwendige Aufwand dürfte irgendwo zwischen 0,5 und 2 Tagen
          liegen.

          Gruß
          Slyh