Frage

Ist es möglich, eine Java anzugeben? classpath Dazu gehört eine JAR -Datei, die in einer anderen JAR -Datei enthalten ist?

War es hilfreich?

Lösung

Wenn Sie versuchen, ein einzelnes Glas zu erstellen, das Ihre Anwendung und ihre erforderlichen Bibliotheken enthält, gibt es zwei Möglichkeiten (die ich kenne). Das erste ist Ein-Jar, der einen speziellen Klassenloader verwendet, um die Verhinderung von Gläsern zu ermöglichen. Das zweite ist Uberjar, (oder Schatten), was die eingeschlossenen Bibliotheken explodiert und alle Klassen in die oberste Glasdose stellt.

Ich sollte auch erwähnen, dass Uberjar und Schatten Plugins für Maven1 bzw. Maven2 sind. Wie unten erwähnt, können Sie auch das Montage -Plugin verwenden (was in Wirklichkeit viel leistungsfähiger, aber viel schwieriger zu konfigurieren ist).

Andere Tipps

Sie möchten diese "Explode -Jar -Inhalte" -Lösungen nicht verwenden. Sie machen es definitiv schwieriger, Dinge zu sehen (da alles auf dem gleichen Niveau explodiert ist). Darüber hinaus kann es zu Konflikten nennen (sollte nicht auftreten, wenn Menschen richtige Pakete verwenden, aber Sie können dies nicht immer kontrollieren).

Die Feature, die Sie wollen, ist eines der der Top 25 Sun Rfes: RFE 4648386, welche Sonne in ihrer unendlichen Weisheit als von geringer Priorität bezeichnet hat. Wir können nur hoffen, dass die Sonne aufwacht ...

In der Zwischenzeit ist die beste Lösung, auf die ich gestoßen bin (die ich wünschte, Sonne würde im JDK kopieren), ist die Verwendung des benutzerdefinierten Klassenladers Jarclassloader.

Nach einigen Nachforschungen habe ich eine Methode gefunden, für die Maven oder eine Verlängerung/das Programm von Drittanbietern nicht erforderlich sind.

Sie können "Klassenpfad" in Ihrer Manifestdatei verwenden.

Zum Beispiel:

Manifest File Manifest.mf erstellen

Manifest-Version: 1.0
Created-By: Bundle
Class-Path: ./custom_lib.jar
Main-Class: YourMainClass

Kompilieren Sie alle Ihre Klassen und laufen Sie jar cfm Testing.jar MANIFEST.MF *.class custom_lib.jar

c steht für Create Archivef Gibt an, dass Sie die Datei angeben möchtenv ist für ausführliche Eingabem bedeutet, dass wir eine benutzerdefinierte Manifestdatei übergeben werden

Stellen Sie sicher, dass Sie LIB in das JAR -Paket aufgenommen haben. Sie sollten in der Lage sein, Jar auf normale Weise zu laufen.

bezogen auf: http://www.ibm.com/developerworks/library/j-5things6/

Alle anderen Informationen, die Sie über den Klassenpfad benötigen, finden Sie hier

Verwenden Sie das ZipGroupFileset Tag (verwendet die gleichen Attribute wie a Dateiset Schild); Es entpackt alle Dateien im Verzeichnis und fügt Ihrer neuen Archivdatei hinzu. Mehr Informationen: http://ant.apache.org/manual/tasks/zip.html

Dies ist ein sehr nützlicher Weg, um das Problem des Jar-in-a-Jar-Problems zu umgehen-ich weiß, weil ich diese genaue Stackoverflow-Frage gegoogelt habe, während ich versucht habe, herauszufinden, was zu tun ist. Wenn Sie ein Glas oder einen Ordner mit Gläser in Ihr ein gebautes Glas mit Ameisen verpacken möchten, vergessen Sie all diese Klassenpfad- oder Drittanbieter-Plugin-Sachen, Sie müssen nur das (in Ant) tun:

<jar destfile="your.jar" basedir="java/dir">
  ...
  <zipgroupfileset dir="dir/of/jars" />
</jar>

Wenn Sie mit ANT bauen (ich verwende Ant aus Eclipse), können Sie einfach die zusätzlichen JAR -Dateien hinzufügen, indem Sie Ant zu Ant hinzufügen, um sie hinzuzufügen ... nicht unbedingt die beste Methode, wenn Sie ein Projekt haben, das von mehreren Personen gewartet wird, es jedoch funktioniert, aber es funktioniert für ein Personsprojekt und ist einfach.

Zum Beispiel war mein Ziel, das die .Jar -Datei erstellt hat,:

<jar destfile="${plugin.jar}" basedir="${plugin.build.dir}">
    <manifest>
        <attribute name="Author" value="ntg"/>
        ................................
        <attribute name="Plugin-Version" value="${version.entry.commit.revision}"/>
    </manifest>
</jar>

Ich habe gerade eine Zeile hinzugefügt, um es zu machen:

<jar ....">
    <zipgroupfileset dir="${external-lib-dir}" includes="*.jar"/>
    <manifest>
        ................................
    </manifest>
</jar>

wo

<property name="external-lib-dir" 
          value="C:\...\eclipseWorkspace\Filter\external\...\lib" />

war das Dir mit den äußeren Gläser. Und das ist es...

Nicht ohne Ihren eigenen Klassenlader zu schreiben. Sie können den Klassenpfad des Glas Gläser hinzufügen, aber sie müssen gemeinsam gelobt und nicht im Hauptglas enthalten sein.

Sie müssen einen benutzerdefinierten Klassenlader erstellen, um dies zu tun, oder eine Bibliothek von Drittanbietern, die dies unterstützt. Am besten extrahieren Sie das Glas aus der Laufzeit und fügen es dem Klassenpfad hinzu (oder lassen Sie es bereits zum Klassenpfad hinzugefügt).

Ich benutze Maven für meine Java -Builds mit einem Plugin namens The Maven -Montage -Plugin.

Es tut das, was Sie fragen, aber wie einige der anderen Vorschläge beschreiben - im Wesentlichen explodieren Sie alle abhängigen Gläser und rekombinieren sie in ein einzelnes Glas

Wenn Sie ECLPISE IDE haben, müssen Sie nur Ihr Glas exportieren und "Paket erforderliche Bibliotheken in generiertes Glas" auswählen. Eclipse fügt automatisch die erforderlichen abhängigen JARs in das generierte Glas hinzu und generiert einige Eclipse -benutzerdefinierte Klassenlader, die diese Gläser automatisch laden.

Ich wollte gerade raten, alle Dateien auf derselben Ebene zu extrahieren und dann ein Glas aus dem Ergebnis zu machen, da das Paketsystem sie ordentlich getrennt halten sollte. Das wäre der manuelle Weg, ich nehme an, die von Steve angegebenen Werkzeuge werden dies gut tun.

Winstone ist ziemlich gut http://blog.jayway.com/2008/11/28/exexecutlewar-with-winstone-maven-plugin/. Aber nicht für komplexe Standorte. Und das ist eine Schande, denn alles, was es braucht, ist, das Plugin einzubeziehen.

Nun, es gibt einen sehr einfachen Weg, wenn Sie Eclipse verwenden.

Exportieren Sie Ihr Projekt als "runnable" JAR-Datei (klicken Sie mit der rechten Maustaste in Eclipse, wählen Sie "Export ..."). Wenn Sie die Exporteinstellungen konfigurieren, wählen Sie unbedingt "Extrahieren Sie die erforderlichen Bibliotheken in generiertes Glas". Denken Sie daran, wählen Sie "Extrakt ..." und nicht "Paket erforderliche Bibliotheken ...".

Zusätzlich: Sie müssen in Ihren Exporteinstellungen eine Run-Konfiguration auswählen. Sie können also in einer Klasse immer eine leere Main () erstellen und sie für Ihre Auslaufkonfiguration verwenden.

Wie auch immer, es ist nicht garantiert Um 100% der Fälle zu arbeiten - wie Sie eine Popup -Nachricht bemerken, die Ihnen aufgefordert wird, dass Sie die Lizenzen der von Ihnen einbezogenen JAR -Dateien überprüfen und etwas über das Kopieren von Signaturdateien nicht kopieren. Ich habe das jedoch für gemacht Jahre und habe nie auf ein Problem gestoßen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top