web-dev-qa-db-fra.com

Meilleure façon de fusionner une version dans un fichier JAR

Existe-t-il un outil ou un script permettant de fusionner facilement un groupe de fichiers JAR dans un fichier JAR? Un bonus serait de définir facilement le manifeste du fichier principal et de le rendre exécutable.

Le cas concret est un outil de texte restructuré Java . Je voudrais le lancer avec quelque chose comme:

Java -jar rst.jar

Autant que je sache, il ne comporte aucune dépendance, ce qui indique qu'il ne devrait pas s'agir d'un outil simple utilisant un seul fichier, mais le fichier Zip téléchargé contient de nombreuses bibliothèques.

      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

Comme vous pouvez le constater, il est plutôt souhaitable de ne pas avoir à le faire manuellement.

Jusqu'à présent, je n'ai fait qu'essayer les logiciels AutoJar et ProGuard, deux logiciels assez faciles à utiliser. Il semble que le pool constant dans les fichiers JAR pose problème.

Apparemment, le premier est légèrement cassé, alors je vais essayer de le réparer. Le fichier Mavenpom.xml était apparemment cassé lui aussi, je devrai donc le réparer avant de le réparer d'abord ... Je me sens comme un aimant des bogues :-)


Mise à jour: je n'ai jamais eu le temps de réparer cette application, mais j'ai jeté un œil à l'assistant d'exportation de JAR de Eclipse , basé sur un gros JAR. J'ai trouvé cela très facile à utiliser pour déployer mon propre code.

Certaines des autres suggestions excellentes pourraient être meilleures pour les compilations dans un environnement non-Eclipse, mais oss devrait probablement faire une compilation Nice en utilisant Ant . (Maven, jusqu'à présent vient de me faire mal, mais d'autres l'aiment.)

70
tovare

Assistant d’exportation de fichiers JAR exécutables d’Eclipse 3.4 JDT.

Dans Eclipse 3.5, cela a été étendu. Vous pouvez maintenant choisir comment vous souhaitez traiter vos fichiers JAR référencés.

33
Stephen Denne

La fourchette zipfileset fait le travail

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

Après avoir essayé plusieurs solutions différentes, j’ai trouvé que One-JAR était le plus facile à utiliser et j’ai réussi à faire exactement cela: produire un seul JAR exécutable contenant tout ce dont j’ai besoin.

One-JAR utilise un chargeur de classe personnalisé qui peut naviguer dans les ressources imbriquées. Regardez le fichier .bat dans le téléchargement, il ressemble à org.codelutin.jrst.JRST dans jrst-0.8.1.jar est la classe principale, votre manifeste devrait donc ressembler à ceci:

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

Ce qui est vraiment génial, c’est que One-JAR se charge de vous transmettre des arguments de ligne de commande. Le classpath est géré par le chargeur de classes personnalisé, en supposant que toutes les ressources dont vous avez besoin soient regroupées dans un seul JAR.

La manière la plus simple d'utiliser One-JAR est d'utiliser ant. il existe une tâche ant personnalisée "one-jar" qui fonctionne comme suit (en supposant que votre manifeste s'appelle "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

Si vous êtes un utilisateur Maven , généralement le plug-in Assembly fait ce que vous voulez, ou potentiellement le plug-in shade, et dans certains cas, une combinaison.

Avec le plugin Assembly, vous mettez un fichier manifeste dans votre projet avec les paramètres nécessaires, bien que les valeurs par défaut soient généralement bonnes. La construction se fait ensuite avec

mvn Assembly:assembly

Ou si vous avez d'autres problèmes particuliers à traiter, l'un des autres objectifs. Tous les fichiers JAR à inclure sont récupérés par le résolveur de dépendances de Maven. Si vous utilisez le plug-in shade, cela fait généralement partie de l'objectif d'installation, et dans un projet en particulier, je le fais maintenant.

mvn install
mvn Assembly:single

L'objectif Assembly:single consiste à résoudre les problèmes de durée de vie, dans le cas présent dans une application Spring .

14
larsivi

Vous pouvez utiliser JarJar qui utilisera l'observation de package pour vous assurer que votre fichier JAR n'entre pas en conflit avec les autres.

8
Steve g

Il existe ProGuard qui ne regroupe pas uniquement vos fichiers JAR, mais il peut également optimiser, nettoyer ou masquer vos fichiers de classe, ce qui rend le fichier JAR obtenu beaucoup plus petit que la somme de tous les fichiers JAR auparavant.

En fait, j'ai essayé ProGuard avec l'outil JRST, et c'est comme vous l'avez indiqué. J'ai essayé de suivre le problème et je l'ai trouvé lié à un bogue dans la bibliothèque ICU4J référencée par jrst. Le problème est que la version ICU utilisée est pour le moment obsolète. J'ai donc remplacé le fichier icu.jar par ICU4J version 3.2. Maintenant, ProGuard trouve un tas d’autres erreurs/avertissements concernant les incohérences dans les bibliothèques de JRST.

Je suppose que ProGuard fonctionne comme prévu, mais les bibliothèques de jrst ne sont tout simplement pas cohérentes. Je ne sais pas si vous pouvez faire beaucoup plus que parler à ses développeurs car ils doivent vérifier et mettre à jour les dépendances du projet.

8
jrudolph

(basé sur 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 vient d'être publié sur http://one-jar.sourceforge.net , et il a été étendu pour prendre en charge des cadres tels que Spring et Guice , qui peuvent présenter des problèmes à d'autres approches. Il gère également l'inversion du chargeur de classe, où certains fichiers JAR sont externes au One-JAR (par exemple, les pilotes JDBC qui ne sont peut-être pas livrés avec le produit).

One-JAR est une ligne de commande avec les plug-ins Ant et Maven 2. Il est également simple de construire en utilisant simplement l'outil "jar".

Je peux également recommander l’exportateur de pots Eclipse (Runnable) sur lequel Ference Hechler a écrit: il a fait un excellent travail en proposant une approche simple pour emballer un ensemble de fichiers JAR. Lui et moi avons travaillé sur One-JAR, mais Jar Exporter est basé sur une base de code différente.

5
simontuffs

Ou en utilisant le plugin Maven Assembly (mvn Assembly: assembly)

3
Philip Helger

Il existe un outil appelé autojar qui analysera votre code secondaire et compilera un fichier .jar avec les classes trouvées, y compris les classes référencées (importées).

Ne fonctionne pas toujours avec quelque chose comme Spring, cependant, où vous spécifiez les noms de classe dans la configuration et il est chargé par le framework.

3
user7094

Je pense que l’outil dont vous avez besoin ici est JarSplice: http://ninjacave.com/jarsplice

Not n’a pas besoin de Ant ou Maven, a sa propre interface graphique, il est simple d’utiliser et de faire exactement ce que vous avez demandé -> Il fusionne le contenu de plusieurs fichiers jar en un seul (s'il vous plaît noter qu'il doit toujours ajouter son propre chargeur de classe).

2
Nadir

Vous devez utiliser le plugin maven shading pour le faire. J'utilise souvent maven pour créer un fichier jar autonome et il est si puissant

Voir plus:

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

0
hoang