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.)
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.
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>
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>
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 .
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.
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.
(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>
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.
Ou en utilisant le plugin Maven Assembly (mvn Assembly: assembly)
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.
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).
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