72 votes

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

Est-il un outil ou un script qui fusionne facilement un tas de JAR fichiers en un seul fichier JAR? Un bonus serait de régler facilement la main-manifeste de fichier et le rendre exécutable.

Le béton est une affaire de Java restructuré outil texte. Je voudrais courir avec quelque chose comme:

java-jar rst.jar

Aussi loin que je peux dire, il n'a pas de dépendances qui indique qu'il ne doit pas être un simple fichier unique outil, mais le fichier ZIP téléchargé contient un grand nombre de 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 peu souhaitable pour ne pas avoir besoin de le faire manuellement.

Jusqu'à présent, j'ai seulement essayé AutoJar et ProGuard, qui ont été assez faciles à obtenir en cours d'exécution. Il semble qu'il y a un problème avec la constante de la piscine dans les fichiers JAR.

Apparemment jrst est légèrement cassée, donc je vais faire un aller de fixation. Le Maven pom.xml le fichier a été apparemment cassé aussi, donc je vais devoir le corriger avant de le fixer jrst ... je me sens comme un bug-aimant :-)


Mise à jour: je n'ai jamais eu l'occasion de la fixation de cette application, mais j'ai vérifié Eclipse'"Runnable JAR assistant d'exportation", qui est basé sur un gros POT. J'ai trouvé cela très facile à utiliser pour le déploiement de mon propre code.

Certains de l'autre excellente suggestion pourrait être mieux pour les versions non-environnement Eclipse, oss devrait probablement faire une belle construction à l'aide de la Fourmi. (Maven, jusqu'à présent vient de m'douleur, mais d'autres aiment ça.)

62voto

akuhn Points 12241

Ant's 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>
 

33voto

Stephen Denne Points 17031

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.

27voto

Ashley Mercer Points 1033

Après avoir essayé quelques solutions différentes, j'ai trouvé Un POT plus facile de travailler avec, et ont réussi à faire exactement cela: produire un seul exécutable JAR qui contient tout ce dont j'ai besoin.

Un BOCAL utilise une classe personnalisée-loader qui ne peut naviguer imbriquée ressources. Regardez la .fichier bat dans le téléchargement, il ressemble org.codelutin.jrst.JRST dans le jrst-0.8.1.jar est la classe principale, de sorte que votre manifeste devrait ressembler à ceci:

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

La chose vraiment cool, c'est que Celui-POT va gérer passant sur les arguments de ligne de commande pour vous. La classe est gérée par la classe personnalisée, chargeur, en supposant que toutes les ressources dont vous avez besoin sont regroupés dans le seul BOCAL.

La façon la plus simple d'utiliser Un POT avec ant; il y a une coutume "one-pot" tâche ant qui fonctionne de la manière suivante (en supposant que votre manifeste est appelé "la tvd.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>

14voto

larsivi Points 1298

Si vous êtes un Maven utilisateur, généralement de l'assemblée plugin faire ce que vous voulez, ou éventuellement de l'ombre plugin, et, dans certains cas, une combinaison.

Avec l'assemblée plugin vous mettez un fichier manifeste dans votre projet avec les paramètres nécessaires, bien que les valeurs par défaut sont généralement assez bon. La construction est réalisée avec

mvn assembly:assembly

Ou si vous avez plus de choses spéciales à traiter, l'un des autres objectifs. Tous les fichiers JAR à comprendre, sont captés par Maven du solveur de dépendances. Si vous utilisez l'ombre plugin, il est généralement partie de l'installation de l'objectif, et en particulier d'un projet que je suis en train de faire maintenant, je ne

mvn install
mvn assembly:single

L' assembly:single objectif est de travailler autour de la durée de vie les problèmes, dans ce cas, un Printemps de l'application.

8voto

jrudolph Points 3726

Il est ProGuard qui n'est pas seulement le pack de votre JAR fichiers en un seul, mais il peut également optimiser, de nettoyage ou de masquer vos fichiers de classe, que la fichier JAR beaucoup plus petite que la somme de tous les fichiers JAR avant.

J'ai effectivement essayé ProGuard avec le JRST outil, et il est comme vous l'avez signalé. J'ai essayé de localiser le problème et l'a trouvé pour se rapporter à un bug dans le ICU4J bibliothèque référencé par jrst. Le problème, c'est que l'utilisation des soins intensifs version est à présent obsolète maintenant. Je l'ai donc remplacé l' icu.jar le fichier avec ICU4J la version 3.2. Maintenant ProGuard trouve un tas d'autres erreurs/avertissements concernant incosistencies avec les bibliothèques de JRST.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X