La manière la plus simple de fusionner une version en un seul fichier JAR

Existe-t-il un outil ou un script qui fusionne facilement un groupe de fichiers JAR en un seul 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é en Java . Je voudrais le lancer avec quelque chose comme:

javajar rst.jar

Autant que je sache, il n’y a pas de dépendances, ce qui indique qu’il ne devrait pas s’agir d’un outil simple à fichier unique, 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 voir, il est souhaitable de ne pas avoir à le faire manuellement.

Jusqu’à présent, j’ai seulement essayé AutoJar et ProGuard, tous deux assez faciles à utiliser. Il semble qu’il y ait un problème avec le pool de constantes dans les fichiers JAR.

Apparemment, le premier est légèrement cassé, alors je vais essayer de le réparer. Le fichier pom.xml Maven était apparemment cassé aussi, donc je devrai le réparer avant de corriger jrst … Je me sens comme un bug-aimant 🙂


Mise à jour: je n’ai jamais réussi à corriger cette application, mais j’ai vérifié l ‘”Assistant d’exportation JAR Runable” d’ Eclipse qui est basé sur un JAR. J’ai trouvé cela très facile à utiliser pour déployer mon propre code.

Certaines des excellentes suggestions pourraient être meilleures pour les builds dans un environnement non-Eclipse, oss devrait probablement faire une belle construction avec Ant . (Maven, jusqu’à présent, vient de me donner de la douleur, mais d’autres l’aiment.)

Assistant d’exportation JAR Runnable 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.

Le zipfileset de Ant fait le travail

     

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

One-JAR utilise un chargeur de classe personnalisé qui peut naviguer dans les ressources nestedes. Regardez le fichier .bat dans le téléchargement, il semble que org.codelutin.jrst.JRST dans le jrst-0.8.1.jar est la classe principale, donc votre manifeste devrait 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 gère les arguments de ligne de commande pour vous. Le classpath est géré par le chargeur de classes personnalisé, en supposant que toutes les ressources dont vous avez besoin sont regroupées dans le JAR unique.

La manière la plus simple d’utiliser One-JAR est d’utiliser ant; il y a une tâche de fourmi “one-jar” personnalisée qui fonctionne comme suit (en supposant que votre manifeste s’appelle “rst.mf”):

   

Si vous êtes un utilisateur de Maven , généralement le plug-in d’assemblage fait ce que vous voulez, ou potentiellement le plug-in de nuance, et parfois une combinaison.

Avec le plug-in Assembly, vous placez un fichier manifeste dans votre projet avec tous les parameters nécessaires, bien que les parameters par défaut soient généralement assez bons. La construction se fait ensuite avec

 mvn assembly:assembly 

Ou si vous avez des choses plus spéciales à gérer, l’un des autres objectives. Tous les fichiers JAR à inclure sont récupérés par le résolveur de dépendances de Maven. Si vous utilisez le plugin shade, il fait généralement partie de l’objective d’installation, et dans un projet particulier, je le fais maintenant.

 mvn install mvn assembly:single 

L’ assembly:single but est de contourner les problèmes de durée de vie, dans ce cas dans une application Spring .

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

ProGuard intègre non seulement vos fichiers JAR en un seul, mais il peut également optimiser, nettoyer ou masquer vos fichiers de classe, ce qui rend le fichier JAR résultant beaucoup plus petit que la sum de tous les fichiers JAR.

J’ai en fait essayé ProGuard avec l’outil JRST, et c’est comme vous l’avez signalé. J’ai essayé de suivre le problème et je l’ai trouvé lié à un bogue de la bibliothèque ICU4J référencé par jrst. Le problème est que la version ICU utilisée est loin d’être obsolète. J’ai donc remplacé le fichier icu.jar par ICU4J version 3.2. ProGuard trouve maintenant un tas d’autres erreurs / avertissements sur les incohérences avec 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 avec ses développeurs car ils doivent vérifier et mettre à jour les dépendances du projet.

(basé sur Andrian):

          

One-JAR 0.97 vient d’être publié sur http://one-jar.sourceforge.net , et il a été étendu avec des frameworks tels que Spring et Guice , ce qui peut poser problème à d’autres approches. Il gère également l’inversion de classloader – où certains fichiers JAR sont externes au One-JAR (par exemple, les pilotes JDBC qui ne peuvent pas être livrés groupés).

One-JAR est en ligne de commande, avec les plug-ins Ant et Maven 2. Il est également simple de construire avec l’outil “jar”.

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

Il existe un outil appelé autojar qui parsing votre bytecode et comstack un fichier .jar avec les classes qu’il trouve, y compris les classes référencées (imscopes).

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

Ou en utilisant le plugin d’assemblage Maven (mvn assembly: assembly)

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

Il ne nécessite ni Ant ni Maven, possède sa propre interface graphique, il est simple à utiliser et fait exactement ce que vous avez demandé -> Il fusionne le contenu de plusieurs fichiers jar en un seul (veuillez noter qu’il doit toujours append son propre chargeur de classe) ).

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

On dirait que Apache Ant est ce que vous cherchez.