Esiste uno strumento o uno script che unisce facilmente un gruppo di JAR file in un file JAR? Un bonus sarebbe quello di impostare facilmente il manifest del file principale e renderlo eseguibile.
Il caso concreto è uno strumento di testo ristrutturato Java . Mi piacerebbe eseguirlo con qualcosa come:
Java -jar rst.jar
Per quanto ne so, non ha dipendenze che indicano che non dovrebbe essere uno strumento a un solo file, ma il file Zip scaricato contiene molte librerie.
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
Come puoi vedere, è in qualche modo desiderabile non aver bisogno di farlo manualmente.
Fino ad ora ho provato solo AutoJar e ProGuard, entrambi abbastanza facili da far girare. Sembra che ci sia qualche problema con il pool costante nei file JAR.
A quanto pare il primo è leggermente rotto, quindi farò un tentativo di aggiustarlo. Il file Mavenpom.xml
era apparentemente rotto, quindi dovrò sistemarlo prima di correggere jrst ... Mi sento come un bug-magnete :-)
Aggiornamento: Non sono mai riuscito a correggere questa applicazione, ma ho controllato la "Procedura guidata di esportazione JAR Runnable Eclipse basata su un JAR grasso. Ho trovato questo molto facile da usare per la distribuzione del mio codice.
Alcuni degli altri eccellenti suggerimenti potrebbero essere migliori per le build in un ambiente non Eclipse, oss probabilmente dovrebbe creare una bella build usando Ant . (Maven, finora mi ha appena dato dolore, ma altri lo adorano).
Eclipse 3.4 Esportazione guidata JAR eseguibile di JDT.
In Eclipse 3.5, questo è stato esteso. Ora puoi scegliere come trattare i file JAR di riferimento.
Il zipfileset
di Ant fa il lavoro
<jar id="files" jarfile="all.jar">
<zipfileset src="first.jar" includes="**/*.Java **/*.class"/>
<zipfileset src="second.jar" includes="**/*.Java **/*.class"/>
</jar>
Avendo provato alcune soluzioni diverse, ho trovato One-JAR il più facile da usare e sono riuscito a fare esattamente questo: produrre un singolo JAR eseguibile che contenga tutto ciò di cui ho bisogno.
One-JAR utilizza un caricatore di classi personalizzato che può navigare tra le risorse annidate. Guarda il file .bat nel download, sembra che org.codelutin.jrst.JRST nel jrst-0.8.1.jar sia la classe principale, quindi il tuo manifest dovrebbe apparire così:
Main-Class: com.simontuffs.onejar.Boot
One-Jar-Main-Class: org.codelutin.jrst.JRST
La cosa veramente interessante è che One-JAR gestirà per te il passaggio degli argomenti da riga di comando. Il classpath è gestito dal programma di caricamento classi personalizzato, supponendo che tutte le risorse necessarie siano raggruppate nel singolo JAR.
Il modo più semplice per usare One-JAR è con la formica; c'è un'attivazione personalizzata "one jar" che funziona come segue (assumendo che il manifest sia chiamato "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>
Se sei un Maven user, tipicamente il plugin Assembly fa quello che vuoi, o potenzialmente il plugin per lo schermo, e in alcuni casi una combinazione.
Con il plugin Assembly hai inserito un file manifest nel tuo progetto con tutte le impostazioni necessarie, anche se le impostazioni predefinite sono generalmente abbastanza buone. L'edificio è quindi fatto con
mvn Assembly:assembly
O se hai altre cose speciali da affrontare, uno degli altri obiettivi. Tutti i file JAR da includere vengono rilevati dal resolver delle dipendenze di Maven. Se si utilizza il plug-in della sfumatura, generalmente fa parte dell'obiettivo di installazione e in un particolare progetto che sto facendo ora lo faccio
mvn install
mvn Assembly:single
L'obiettivo Assembly:single
è di aggirare i problemi di durata, in questo caso in un'applicazione Spring .
Puoi usare JarJar che userà il pacchetto shadowing per assicurarti che il tuo file JAR non sia in conflitto con gli altri.
C'è ProGuard che non solo impacchetta i file JAR in uno solo, ma può anche ottimizzare, ripulire o offuscare i file di classe, rendendo il file JAR risultante molto più piccolo della somma di tutti i file JAR precedenti.
Ho effettivamente provato ProGuard con lo strumento JRST, ed è come hai segnalato. Ho provato a rintracciare il problema e ho trovato che si riferisce a a bug nella libreria ICU4J a cui fa riferimento jrst. Il problema è che la versione ICU usata è ormai superata. Così ho sostituito il file icu.jar
con ICU4J versione 3.2. Ora ProGuard trova un sacco di altri errori/avvertenze sulle incostanze con le librerie di JRST.
La mia ipotesi è che ProGuard funzioni come previsto, ma le librerie di jrst non sono coerenti. Non so se puoi fare molto di più che parlare con i suoi sviluppatori dato che dovrebbero controllare e aggiornare le dipendenze del progetto.
(basato su 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>
One-JAR 0.97 è stato appena rilasciato su http://one-jar.sourceforge.net , ed è stato esteso con supporto per framework come Spring e Guice , che potrebbero presentare problemi ad altri approcci. Gestisce anche l'inversione del classloader - dove alcuni file JAR sono esterni a One-JAR (ad esempio, JDBC driver che potrebbero non essere spediti in bundle).
One-JAR è una riga di comando, con Ant e Maven 2 plugin. È anche semplice costruire semplicemente usando lo strumento "jar".
Posso anche raccomandare Eclipse Jar Exporter (Runnable) su cui ha scritto Ference Hechler: ha fatto un ottimo lavoro nel proporre un approccio semplice per il wrapping di un set di file JAR. Lui e io abbiamo lavorato su One-JAR, ma Jar Exporter si basa su un codice diverso.
O usando il plugin Assembly Maven (mvn Assembly: assembly)
C'è uno strumento chiamato autojar che scansiona il tuo bytecode e compila un file .jar con le classi che trova, incluse le classi di riferimento (importate).
Tuttavia, non sempre funziona con qualcosa come Spring, dove si specificano i nomi di classe nella configurazione e questo viene caricato dal framework.
Penso che lo strumento di cui hai bisogno qui sia JarSplice: http://ninjacave.com/jarsplice
Fa not richiede Ant o Maven, ha la sua GUI, è semplice da usare e fa esattamente quello che hai chiesto -> Mescola il contenuto di diversi file jar in uno solo (notare che è ancora necessario aggiungere il proprio classloader).
Dovresti usare il plugin Maven shading per farlo. Uso spesso Maven per creare file jar standalone ed è così potente
Vedi altro:
http://maven.Apache.org/plugins/maven-shade-plugin/examples/includes-excludes.html