Meilleure façon de fusionner une version dans un fichier JAR
-
09-06-2019 - |
Question
Existe-t-il un outil ou un script permettant de fusionner facilement plusieurs 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é en Java . Je voudrais le lancer avec quelque chose comme:
java -jar rst.jar
Pour autant que je sache, il n’a pas de dépendances, ce qui signifie que ce ne devrait pas être 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, j'ai seulement essayé AutoJar et ProGuard, deux logiciels assez faciles à utiliser. Il semble que le pool constant dans les fichiers JAR pose un problème.
Apparemment, le premier est légèrement cassé, je vais donc essayer de le réparer. Le fichier Maven Mise à jour: Je n'ai jamais résolu cette application, mais j’ai vérifié Eclipse
Certaines des autres suggestions excellentes pourraient être meilleures pour les constructions dans un environnement non-Eclipse. oss devrait probablement faire une belle construction en utilisant Ant . (Maven, jusqu'à présent m'a juste fait mal, mais d'autres l'aiment.) pom.xml
était apparemment également endommagé, donc je ' Il va falloir que je répare ça avant de réparer jrst ... Je me sens comme un insecte:
La solution
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.
Autres conseils
Le zipfileset
de Ant effectue 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é One-JAR le plus simple à utiliser, et ont réussi à faire exactement cela: produire un seul fichier 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 nécessaires sont regroupées dans un seul JAR.
Le moyen le plus simple d’utiliser One-JAR consiste à utiliser ant; il y a une coutume "un pot" La tâche ant 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 de Maven , le plug-in d'assemblage fait généralement ce que vous voulez, ou potentiellement le plugin nuance, et dans certains cas une combinaison.
Avec le plugin d'assemblage, vous insérez dans votre projet un fichier manifeste avec les paramètres nécessaires, bien que les valeurs par défaut soient généralement très 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, il fait généralement partie de l'objectif d'installation et, dans l'un de mes projets en cours, 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 ce cas, dans un Spring application.
Vous pouvez utiliser JarJar , qui utilisera l'observation de package pour vous assurer que votre fichier JAR ne fonctionne pas. pas en conflit avec les autres.
Il existe ProGuard , qui ne regroupe pas uniquement vos fichiers JAR, mais 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 précédents.
J'ai en fait essayé ProGuard avec l'outil JRST, et c'est ce que vous avez dit. J'ai essayé de localiser le problème et je l'ai trouvé en relation avec un bogue dans la bibliothèque ICU4J référencée par jrst. Le problème est que la version ICU utilisée est bien dépassée pour le moment. 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.
(d'après Andrian's):
<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é à l'adresse http://one-jar.sourceforge.net , et il a été étendu pour prendre en charge des cadres tels que Spring et Guice , ce qui peut poser problème pour les autres approches. Il gère également l'inversion du chargeur de classe, où certains fichiers JAR sont externes à One-JAR (par exemple, JDBC pilotes qui ne peuvent pas être livrés groupés).
One-JAR est une ligne de commande avec Ant et Maven 2 plugins. Il est également simple de construire simplement en utilisant le "jar". outil.
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 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.
Il existe un outil appelé autojar qui scanne votre bytecode et compile un fichier .jar avec les classes trouvées, y compris les classes référencées (importées).
Ne fonctionne pas toujours avec Spring, par exemple, dans lequel vous spécifiez les noms de classe dans la configuration et qui sont chargés par le framework.
Ou en utilisant le plugin d'assemblage Maven (assemblage mvn: assembly)
Je pense que l'outil dont vous avez besoin ici est JarSplice : http://ninjacave.com/ coupelle
Cela ne nécessite pas Ant ou Maven, il possède sa propre interface graphique, il est facile à utiliser et à faire exactement ce que vous avez demandé - > Il fusionne le contenu de plusieurs fichiers jar en un seul (veuillez noter qu'il doit toujours ajouter son propre chargeur de classes).
Vous devriez 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
Cela ressemble à Apache Ant est ce que vous recherchez.