it-swarm.it

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

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

70
tovare

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.

33
Stephen Denne

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>
62
akuhn

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>
27
Ashley Mercer

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 .

14
larsivi

Puoi usare JarJar che userà il pacchetto shadowing per assicurarti che il tuo file JAR non sia in conflitto con gli altri.

8
Steve g

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.

8
jrudolph

(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>
7
象嘉道

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.

5
simontuffs

O usando il plugin Assembly Maven (mvn Assembly: assembly)

3
Philip Helger

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.

3
user7094

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

2
Nadir

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

0
hoang