[Java] Il modo più semplice per unire una versione in un file JAR



Answers

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>
Question

C'è uno strumento o uno script che unisce facilmente un gruppo di file JAR 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 di Java . Mi piacerebbe eseguirlo con qualcosa come:

java -jar rst.jar

Per quanto posso dire, 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.

Finora 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.

Apparentemente il primo è leggermente rotto, quindi farò un tentativo di aggiustarlo. Il file Maven pom.xml era apparentemente rotto, quindi dovrò sistemarlo prima di aggiustare il jrst ... mi sento come un bug-magnete :-)

Aggiornamento: Non sono mai riuscito a correggere questa applicazione, ma ho controllato la "Procedura guidata di esportazione Runnable JAR" di Eclipse , basata su un JAR grasso. Ho trovato questo molto facile da usare per l'implementazione del mio codice.

Alcuni degli altri suggerimenti eccellenti 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).







One-JAR 0.97 è stato appena rilasciato su One-Jar ed è stato esteso con il supporto di 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, i driver JDBC che potrebbero non essere spediti in bundle).

One-JAR è a riga di comando, con i plugin Ant e Maven 2. È 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.




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 scoperto che si riferisce a un bug nella libreria ICU4J a cui fa riferimento jrst. Il problema è che la versione ICU usata è ormai superata in questo momento. 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.




O utilizzando il plug-in di assembly Maven (mvn assembly: assembly)




Se sei un utente Maven , in genere il plug-in di assembly fa ciò che vuoi, o potenzialmente il plugin per lo schermo e, in alcuni casi, una combinazione.

Con il plug-in di assembly si inserisce un file manifest nel progetto con tutte le impostazioni necessarie, sebbene le impostazioni predefinite siano in genere 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 per gli ombreggiamenti, di solito fa parte dell'obiettivo di installazione e in un particolare progetto che sto facendo ora lo faccio

mvn install
mvn assembly:single

L' assembly:single obiettivo è risolvere i problemi di durata, in questo caso in un'applicazione Spring .




Links