Der einfachste Weg, um eine Freisetzung in einer JAR-Datei zu verschmelzen
-
09-06-2019 - |
Frage
Gibt es ein Tool oder ein Skript, das leicht eine Reihe von JAR verschmilzt Dateien in einer JAR-Datei? Ein Bonus wäre leicht die Haupt-Datei Manifest zu setzen und es ausführbar machen.
Der konkrete Fall ist ein Java neu strukturiert Textwerkzeug . Ich möchte es mit etwas laufen wie:
java -jar rst.jar
Soweit ich das beurteilen kann, hat es keine Abhängigkeiten, die anzeigt, dass es keine einfache Single-File-Werkzeug sein sollte, aber die heruntergeladene ZIP-Datei viele Bibliotheken enthält.
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 ein wenig wünschenswert, nicht dies manuell tun müssen.
Bisher habe ich nur versucht AutoJar und ProGuard, von denen beide ziemlich einfach waren zum Laufen zu bringen. Es scheint, dass es einige Probleme mit dem Konstanten-Pool in den JAR-Dateien.
Offenbar jrst etwas gebrochen ist, so werde ich einen Sprung machen es zu fixieren. Die Maven pom.xml
Datei wurde offenbar auch gebrochen, also werde ich das in Ordnung bringen müssen, bevor jrst fixieren. .. ich fühle mich wie ein Bug-Magnet: -)
Update: Ich habe nie um diese Anwendung zu Festsetzung, aber ich ausgecheckt Eclipse- 's "Runnable JAR Export-Assistenten", die auf einem Fett JAR basieren. Ich fand das sehr einfach meinen eigenen Code für die Implementierung zu verwenden.
Einige der anderen ausgezeichneten Vorschläge könnten besser sein, in einer nicht-Eclipse-Umgebung aufbaut, oss wahrscheinlich einen schönen Build machen sollte mit Ant . (Maven, hat bisher nur mir gegeben Schmerz, aber andere lieben es.)
Lösung
Eclipse-3.4 Runnable JAR Export Assistenten JDT.
In Eclipse 3.5, dies wird erweitert. Jetzt können Sie wählen, wie Sie Ihre referenzierten JAR-Dateien behandeln wollen.
Andere Tipps
Ant zipfileset
macht den Job
<jar id="files" jarfile="all.jar">
<zipfileset src="first.jar" includes="**/*.java **/*.class"/>
<zipfileset src="second.jar" includes="**/*.java **/*.class"/>
</jar>
Nachdem ein paar verschiedene Lösungen probiert, ich die einfachste rel="noreferrer"> mit zu arbeiten, und zu machen, hat es geschaffen, genau das tun. einen einzelnen, ausführbaren JAR erzeugen, die alles enthält, ich brauche
Ein-JAR verwendet einen benutzerdefinierten Klasse-Loader, die verschachtelten Ressourcen navigieren kann. Schauen Sie sich die BAT-Datei im Download, es sieht aus wie org.codelutin.jrst.JRST im jrst-0.8.1.jar ist die Hauptklasse, so dass Ihr manifestieren sollte wie folgt aussehen:
Main-Class: com.simontuffs.onejar.Boot
One-Jar-Main-Class: org.codelutin.jrst.JRST
Die wirklich coole Sache ist, dass ein JAR auf Befehlszeilenargumente für Sie vorbei behandelt. Der Classpath von dem benutzerdefinierten Klassenlader gehandhabt wird, alle Ressourcen, vorausgesetzt, Sie müssen in den einzelnen JAR gebündelt.
Der einfachste Weg, One-JAR zu verwenden ist mit Ameise; gibt es eine individuelle "one-jar" Ant-Task, die wie folgt funktioniert (vorausgesetzt, Ihr Manifest "rst.mf" genannt):
<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>
Wenn Sie eine Maven Benutzer, in der Regel der Montag Plugin tun, was Sie wollen, oder möglicherweise die Schatten-Plugin, und in einigen Fällen eine Kombination.
Bei der Montage Plugin Sie eine Manifest-Datei in Ihrem Projekt setzen mit allen notwendigen Einstellungen, obwohl die Standardwerte in der Regel recht gut sind. Gebäude erfolgt dann mit
mvn assembly:assembly
Oder wenn Sie mehr spezielle Dinge zu behandeln, eine der anderen Ziele. Alle JAR-Dateien enthalten, werden von Maven Abhängigkeitsauflöser aufgenommen. Wenn Sie die Schatten-Plugin verwenden, es ist in der Regel Teil des Ziels installieren, und in einem bestimmten Projekt, das ich mache ich jetzt tun
mvn install
mvn assembly:single
Das assembly:single
Ziel ist es um Lebensdauer Themen zu arbeiten, in diesem Fall in einem Frühling Anwendung .
Sie können mit JarJar dem Paket-Shadowing verwendet Ihre JAR-Datei doesn, um sicherzustellen, ‚t Konflikt mit anderen.
Es gibt ProGuard die nur packt nicht Ihre JAR-Dateien in eine, aber es kann auch optimieren, Bereinigung oder verschleiern Ihre Klassendateien, bevor die resultierende JAR-Datei viel kleiner ist als die Summe aller JAR-Dateien zu machen.
ich tatsächlich versucht ProGuard mit dem JRST Werkzeug, und es ist, wie Sie berichtet. Ich habe versucht, das Problem ausfindig zu machen und fand es href="http://bugs.icu-project.org/trac/ticket/3209" rel="nofollow noreferrer"> einen Fehler beziehen sich auf icu.jar Datei mit ICU4J Version 3.2. Jetzt ProGuard findet eine Reihe von anderen Fehler / Warnungen über incosistencies 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, wenn Sie viel mehr tun können, als mit seinen Entwicklern zu sprechen, da sie sollten die Abhängigkeiten des Projektes überprüfen und aktualisieren.
(basierend auf Andrians):
<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>
Ein-JAR 0.97 wurde soeben veröffentlicht unter http://one-jar.sourceforge.net , und es für Frameworks wie Frühling und Guice , die Schwierigkeiten zu anderen Ansätzen darstellen können. Es behandelt auch Classloader-Inversion - wo einige JAR-Dateien extern zu der One-JAR-Datei (zum Beispiel JDBC Treiber, die gebündelt werden können, nicht ausgeliefert).
Ein-JAR ist Befehlszeile, mit Ant und Maven 2 Plug-In. Es ist auch einfach nur mit dem „jar“ Werkzeug zu bauen.
Ich kann auch den Eclipse-Jar Exporteur (Runnable), auf dem Ference Hechler schrieb empfehlen: er in der kommenden mit einem einfachen Ansatz hat einen tollen Job eine Reihe von JAR-Dateien zu wickeln. Er und ich arbeitete an One-JAR, aber das Glas Exporteur basiert auf einem anderen Codebasis.
Es gibt ein Tool namens autojar die Ihre Bytecode scannt und eine .jar-Datei kompilieren mit die Klassen es, einschließlich verwiesen (importiert) Klassen findet.
funktioniert nicht immer mit so etwas wie Frühling, obwohl, wo Sie die Klassennamen in der Konfiguration festlegen, und es wird durch den Rahmen geladen.
oder mit der Maven Montage-Plugin (mvn assembly: assembly)
Ich denke, dass das Werkzeug, das Sie hier brauchen, ist JarSplice : http://ninjacave.com/ jarsplice
Es hat nicht erfordern Ant oder Maven, seine eigene GUI hat, ist es einfach, genau zu bedienen und tun, was Sie gefragt -> Es führt den Inhalt von mehreren jar Dateien zu einem einzigen (bitte beachten sie müssen noch einen eigenen Classloader hinzufügen).
Sie sollten Maven Shading-Plugin verwenden, das zu tun. Ich verwende Maven oft eigenständige jar-Datei zu erstellen und es ist so mächtig
Sehen Sie mehr:
http://maven.apache.org/ plugins / maven-Schatten-Plugin / examples / includes-excludes.html
Klingt wie Apache Ant ist das, was Sie suchen.