it-swarm-eu.dev

Einfachste Möglichkeit, eine Version in einer JAR-Datei zusammenzuführen

Gibt es ein Werkzeug oder ein Skript, das mühelos eine Reihe von JAR -Dateien in einer JAR-Datei zusammenführt? Ein Bonus wäre, das Manifest der Hauptdatei einfach einzustellen und ausführbar zu machen.

Der konkrete Fall ist ein Java-strukturiertes Textwerkzeug . Ich möchte es mit so etwas laufen lassen:

Java -jar rst.jar

Soweit ich das beurteilen kann, gibt es keine Abhängigkeiten, was darauf hindeutet, dass es sich nicht um ein einfaches Einzeldatei-Tool handeln sollte, aber die heruntergeladene Zip-Datei enthält viele Bibliotheken.

      0  11-30-07 10:01   jrst-0.8.1/
    922  11-30-07 09:53   jrst-0.8.1/jrst.bat
    898  11-30-07 09:53   jrst-0.8.1/jrst.sh
   2675  11-30-07 09:42   jrst-0.8.1/readmeEN.txt
 108821  11-30-07 09:59   jrst-0.8.1/jrst-0.8.1.jar
   2675  11-30-07 09:42   jrst-0.8.1/readme.txt
      0  11-30-07 10:01   jrst-0.8.1/lib/
  81508  11-30-07 09:49   jrst-0.8.1/lib/batik-util-1.6-1.jar
2450757  11-30-07 09:49   jrst-0.8.1/lib/icu4j-2.6.1.jar
 559366  11-30-07 09:49   jrst-0.8.1/lib/commons-collections-3.1.jar
  83613  11-30-07 09:49   jrst-0.8.1/lib/commons-io-1.3.1.jar
 207723  11-30-07 09:49   jrst-0.8.1/lib/commons-lang-2.1.jar
  52915  11-30-07 09:49   jrst-0.8.1/lib/commons-logging-1.1.jar
 260172  11-30-07 09:49   jrst-0.8.1/lib/commons-primitives-1.0.jar
 313898  11-30-07 09:49   jrst-0.8.1/lib/dom4j-1.6.1.jar
1994150  11-30-07 09:49   jrst-0.8.1/lib/fop-0.93-jdk15.jar
  55147  11-30-07 09:49   jrst-0.8.1/lib/activation-1.0.2.jar
 355030  11-30-07 09:49   jrst-0.8.1/lib/mail-1.3.3.jar
  77977  11-30-07 09:49   jrst-0.8.1/lib/servlet-api-2.3.jar
 226915  11-30-07 09:49   jrst-0.8.1/lib/jaxen-1.1.1.jar
 153253  11-30-07 09:49   jrst-0.8.1/lib/jdom-1.0.jar
  50789  11-30-07 09:49   jrst-0.8.1/lib/jewelcli-0.41.jar
 324952  11-30-07 09:49   jrst-0.8.1/lib/looks-1.2.2.jar
 121070  11-30-07 09:49   jrst-0.8.1/lib/junit-3.8.1.jar
 358085  11-30-07 09:49   jrst-0.8.1/lib/log4j-1.2.12.jar
  72150  11-30-07 09:49   jrst-0.8.1/lib/logkit-1.0.1.jar
 342897  11-30-07 09:49   jrst-0.8.1/lib/lutinwidget-0.9.jar
2160934  11-30-07 09:49   jrst-0.8.1/lib/docbook-xsl-nwalsh-1.71.1.jar
 301249  11-30-07 09:49   jrst-0.8.1/lib/xmlgraphics-commons-1.1.jar
  68610  11-30-07 09:49   jrst-0.8.1/lib/sdoc-0.5.0-beta.jar
3149655  11-30-07 09:49   jrst-0.8.1/lib/xalan-2.6.0.jar
1010675  11-30-07 09:49   jrst-0.8.1/lib/xercesImpl-2.6.2.jar
 194205  11-30-07 09:49   jrst-0.8.1/lib/xml-apis-1.3.02.jar
  78440  11-30-07 09:49   jrst-0.8.1/lib/xmlParserAPIs-2.0.2.jar
  86249  11-30-07 09:49   jrst-0.8.1/lib/xmlunit-1.1.jar
 108874  11-30-07 09:49   jrst-0.8.1/lib/xom-1.0.jar
  63966  11-30-07 09:49   jrst-0.8.1/lib/avalon-framework-4.1.3.jar
 138228  11-30-07 09:49   jrst-0.8.1/lib/batik-gui-util-1.6-1.jar
 216394  11-30-07 09:49   jrst-0.8.1/lib/l2fprod-common-0.1.jar
 121689  11-30-07 09:49   jrst-0.8.1/lib/lutinutil-0.26.jar
  76687  11-30-07 09:49   jrst-0.8.1/lib/batik-ext-1.6-1.jar
 124724  11-30-07 09:49   jrst-0.8.1/lib/xmlParserAPIs-2.6.2.jar

Wie Sie sehen können, ist es etwas wünschenswert, dies nicht manuell tun zu müssen.

Bisher habe ich nur AutoJar und ProGuard ausprobiert, die beide ziemlich einfach zu laufen waren. Es scheint, dass es Probleme mit dem konstanten Pool in den JAR-Dateien gibt.

Anscheinend ist jrst ein bisschen kaputt, also werde ich versuchen, es zu reparieren. Die Mavenpom.xml-Datei war anscheinend ebenfalls defekt, also muss ich das beheben, bevor sie jrst repariert wird ... Ich fühle mich wie ein Wanzenmagnet :-)


Update: Ich habe es nie geschafft, diese Anwendung zu reparieren, aber ich habe den "Runnable JAR Export Wizard" von Eclipse ausgecheckt, der auf einem fetten JAR basiert. Ich fand das sehr einfach für die Bereitstellung meines eigenen Codes.

Einige der anderen hervorragenden Vorschläge sind möglicherweise besser für Builds in einer Umgebung ohne Eclipse. Oss sollte wahrscheinlich einen Nice-Build mit Ant erstellen. (Maven hat mir bisher nur Schmerzen bereitet, aber andere lieben es.)

70
tovare

Eclipse 3.4 JDT Runnable JAR-Exportassistent.

In Eclipse 3.5 wurde dies erweitert. Jetzt können Sie auswählen, wie Sie Ihre referenzierten JAR-Dateien behandeln möchten.

33
Stephen Denne

Die zipfileset von Ant erledigt den Job

<jar id="files" jarfile="all.jar">
    <zipfileset src="first.jar" includes="**/*.Java **/*.class"/>
    <zipfileset src="second.jar" includes="**/*.Java **/*.class"/>
</jar>
62
akuhn

Nachdem ich ein paar verschiedene Lösungen ausprobiert hatte, fand ich One-JAR am einfachsten zu arbeiten und habe es geschafft, genau das zu tun: eine einzige ausführbare JAR zu erstellen, die alles enthält, was ich brauche.

One-JAR verwendet einen benutzerdefinierten Klassenlader, der in verschachtelten Ressourcen navigieren kann. Schauen Sie sich die .bat-Datei im Download an. Sie sieht aus wie org.codelutin.jrst.JRST in der Datei jrst-0.8.1.jar. Die Hauptklasse ist.

Main-Class: com.simontuffs.onejar.Boot
One-Jar-Main-Class: org.codelutin.jrst.JRST

Die wirklich coole Sache ist, dass One-JAR die Weitergabe von Befehlszeilenargumenten für Sie übernimmt. Der Klassenpfad wird vom benutzerdefinierten Klassenladeprogramm verarbeitet, sofern alle benötigten Ressourcen in der einzelnen JAR zusammengefasst sind.

Der einfachste Weg, One-JAR zu verwenden, ist die Ameise. Es gibt eine benutzerdefinierte "One-Jar-Ameisenaufgabe", die wie folgt funktioniert (vorausgesetzt, Ihr Manifest heißt "rst.mf"):

<target name="jar-rst">
    <one-jar destfile="rst.jar" manifest="rst.mf">
        <main jar="jrst-0.8.1.jar" />
        <lib>
            <fileset dir="${pathToJars}">
                <include name="batik-util-1.6-1.jar" />
                <include name="icu4j-2.6.1.jar" />
                <include name="commons-collections-3.1.jar" />
                <!-- Snip -->
            </fileset>
        </lib>
    </one-jar>
</target>
27
Ashley Mercer

Wenn Sie ein Benutzer von Maven sind, machen das Assembly-Plugin normalerweise das, was Sie möchten, oder möglicherweise das Schatten-Plugin und in einigen Fällen eine Kombination.

Mit dem Assembly-Plugin fügen Sie in Ihrem Projekt eine Manifestdatei mit den erforderlichen Einstellungen ein, obwohl die Standardeinstellungen in der Regel recht gut sind. Dann ist mit dem Aufbau fertig

mvn Assembly:assembly

Oder wenn Sie mehr besondere Dinge zu erledigen haben, eines der anderen Ziele. Alle einzubeziehenden JAR-Dateien werden vom Abhängigkeitsauflöser von Maven abgerufen. Wenn Sie das Schatten-Plugin verwenden, ist es normalerweise Teil des Installationsziels. In einem bestimmten Projekt mache ich es jetzt

mvn install
mvn Assembly:single

Das Assembly:single-Ziel besteht darin, Probleme mit der Lebensdauer zu umgehen, in diesem Fall in einer Spring -Anwendung.

14
larsivi

Sie können JarJar verwenden, um das Spiegeln von Paketen zu verwenden, um sicherzustellen, dass Ihre JAR-Datei nicht mit anderen in Konflikt steht.

8
Steve g

Es gibt ProGuard , das Ihre JAR-Dateien nicht nur in eine packt, sondern auch Klassendateien optimieren, bereinigen oder verschleiern kann, wodurch die resultierende JAR-Datei viel kleiner ist als die Summe aller vorherigen JAR-Dateien.

Ich habe ProGuard tatsächlich mit dem JRST-Tool ausprobiert, und es ist, wie Sie berichtet haben. Ich habe versucht, das Problem aufzuspüren und habe festgestellt, dass es sich auf einen Fehler in der ICU4J-Bibliothek bezieht, auf die von jrst verwiesen wird. Das Problem ist, dass die verwendete ICU -Version momentan weit überholt ist. Also habe ich die icu.jar-Datei durch ICU4J Version 3.2 ersetzt. Jetzt findet ProGuard eine Reihe weiterer Fehler/Warnungen zu Inkonsistenzen mit den Bibliotheken von JRST.

Meine Vermutung ist, dass ProGuard wie erwartet funktioniert, aber die Bibliotheken von jrst sind einfach nicht konsistent. Ich weiß nicht, ob Sie viel mehr tun können, als mit den Entwicklern zu sprechen, da sie die Abhängigkeiten des Projekts überprüfen und aktualisieren sollten.

8
jrudolph

(basierend auf Andrian):

<jar id="files" jarfile="all.jar">
  <zipgroupfileset dir="${library.dir}" includes="*.jar" excludes="test-helper.jar"/>
  <zipfileset src="first.jar" includes="**/*.Java **/*.class"/>
  <zipfileset src="second.jar" includes="**/*.Java **/*.class"/>
  <fileset dir=".">
    <include name="LICENSE"/>
    <include name="NOTICE"/>
  </fileset>
</jar>
7
象嘉道

One-JAR 0.97 wurde soeben unter http://one-jar.sourceforge.net veröffentlicht und mit Unterstützung für Frameworks wie Spring und Guice erweitert Ärger für andere Ansätze. Es behandelt auch Classloader-Inversion, bei der sich einige JAR-Dateien außerhalb der One-JAR befinden (z. B. JDBC - Treiber, die möglicherweise nicht im Lieferumfang enthalten sind).

Ein-JAR ist eine Befehlszeile mit Ant und Maven 2-Plugins. Es ist auch einfach, mit dem "jar" -Tool zu bauen.

Ich kann auch den Eclipse Jar Exporter (Runnable) empfehlen, auf den Ference Hechler schrieb: Er hat eine großartige Arbeit geleistet, indem er einen einfachen Ansatz zum Einpacken von JAR-Dateien gefunden hat. Er und ich haben an One-JAR gearbeitet, aber der Jar Exporter basiert auf einer anderen Codebase.

5
simontuffs

Oder mit dem Maven Assembly Plugin (mvn Assembly: Assembly)

3
Philip Helger

Es gibt ein Tool namens autojar , das Ihren Bytecode scannt und eine .jar-Datei mit den gefundenen Klassen einschließlich der referenzierten (importierten) Klassen kompiliert.

Funktioniert nicht immer mit etwas wie Spring, bei dem Sie die Klassennamen in der Konfiguration angeben und vom Framework geladen werden.

3
user7094

Ich denke, das Werkzeug, das Sie hier brauchen, ist JarSplice: http://ninjacave.com/jarsplice

Es erfordert nicht Ant oder Maven, hat eine eigene GUI, es ist unkompliziert zu verwenden und genau das zu tun, was Sie gefragt haben -> Es fügt den Inhalt mehrerer JAR-Dateien in einer einzigen zusammen} _ (Bitte beachten Sie, dass noch ein eigener Classloader hinzugefügt werden muss).

2
Nadir

Sie sollten dazu das Plug-In für Maven-Shading verwenden. Ich benutze oft Maven, um Standalone-JAR-Dateien zu erstellen, und es ist so mächtig

Mehr sehen:

http://maven.Apache.org/plugins/maven-shade-plugin/examples/includes-excludes.html

0
hoang