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 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:

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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top