web-dev-qa-db-fra.com

Comment combiner deux fichiers Jar

Est-il possible de combiner deux fichiers JAR de telle sorte que, dans une balise d'applet, je puisse simplement faire quelque chose comme:

archive="jarjar.jar/jar1.jar"...  ...archive="jarjar.jar/jar2.jar"... instead of
archive="jar1.jar"... ...archive="jar2.jar"...

Je n'ai besoin que d'un seul fichier jar, donc mettre deux fichiers jar dans un dossier ne m'aidera pas.

25
Tony

Bien sûr, il suffit d'extraire les deux fichiers JAR et d'en recréer un nouveau

$ mkdir tmp
$ (cd tmp; unzip -uo ../jar1.jar)
$ (cd tmp; unzip -uo ../jar2.jar)
$ jar -cvf combined.jar -C tmp .

La substance avec tmp garantit que les deux fichiers JAR existants sont extraits dans un répertoire propre, puis le nouveau créé à partir de celui-ci.

Sachez que vous devrez peut-être également fusionner les fichiers manifest.mf qu'il contient et, le cas échéant, inclure l'option '-m' dans cette commande de fichier.

64
Alnitak

Utilisez zipgroupfileset avec la tâche Ant Zip

<Zip destfile="out.jar">
    <zipgroupfileset dir="lib" includes="*.jar"/>
</Zip>

Pourrait vous aider.

5
ykombinator

Si vous utilisez gradle, ajoutez simplement ce qui suit à build.gradle. Aucun plugin requis. Si vous avez besoin d'options spéciales, optez pour le plugin Fatjar, comme le suggère initialZero. 

task superSimpleJar(type: Jar) {
    baseName = project.name + '-all'
    from { configurations.compile.collect { it.isDirectory() ? it :     zipTree(it) } }
    with jar
}

Pour le projet Android, ajoutez ceci à app/build.gradle et exécutez "gradlew superSimpleJar". Trouver le fichier jar dans build/libs/app-all.jar

task superSimpleJar(type: Jar) {
baseName = project.name + '-all'
from {

    configurations.compile.findAll {

    it.getName() != 'Android.jar'

    }.collect {

    it.isDirectory() ? it : zipTree(it)

    }
 }
}
2
Charlie Dalsass

Il suffit de décompresser les deux fichiers JAR, puis de compresser les résultats dans un fichier Zip, puis de renommer jar.

Mais comme l'a dit Adarshr: Mieux vaut utiliser la commande jar pour cela.

1
Daniel

Il y a aussi le plugin Eclipse fatjar.

1
initialZero

Extraire les deux pots et créer un nouveau fonctionne. (Utilisez les commandes jar présentées ci-dessus) . Un inconvénient concernant le fichier manifeste est que vous souhaitez extraire le fichier jar dont vous souhaitez conserver le fichier manifeste. 

0
sumanth.donthula
<?xml version="1.0" encoding="UTF-8"?>
<project name="Zip-test" default="Zip" basedir=".">

    <target name="Zip">
        <Zip destfile="out.jar">
            <zipgroupfileset dir="." includes="*.jar"/>
        </Zip>
    </target>
</project>

enregistrez ce code dans le fichier build.xml et conservez-le dans le même dossier où tous les fichiers jar à combiner sont conservés. Ouvrez cmd, indiquez le chemin du dossier et exécutez la commande: ant Zip.

Il générera out.jar qui est une combinaison de tous les fichiers jars.

0
Chetna rustagi

Je sais que c'est une vieille question et je voulais juste ajouter mes deux sous (pas de permission de commenter, donc créer une nouvelle réponse).

Je pense que la réponse de sumanth.donthula présente un intérêt, car le problème qui nous préoccupe tous est de savoir comment gérer les fichiers manifestes. Dans mon cas, je souhaitais fusionner certains fichiers de bibliothèque (principalement le code client du service Web généré) dans le fichier jar d'une application que j'ai écrite. C'était correct de remplacer les manifestes par celui de mon propre pot.

La façon la plus simple de procéder consiste à respecter l'ordre dans lequel vous décompressez les fichiers d'origine (comme indiqué par Alnitak et sumanth.donthula).

Je voulais utiliser la tâche Zip ant (merci, ykombinator, pour l’idée). Il s’est avéré que le seul moyen de contrôler l’ordre de compression/conditionnement consiste à renommer les fichiers. Voir ma cible de fourmi ci-dessous.

Le répertoire de sortie dans mon exemple s'appelle codemodule.dir (j'ai créé un module de code FileNet). Les autres noms s'expliquent d'eux-mêmes. L'étape importante consiste à renommer le fichier jar de l'application en 0 _... afin qu'il soit le premier de la liste. De cette façon, son manifeste sera conservé car l'attribut duplicate de la tâche Zip ant est configuré pour être préservé.

<target name="merge_jars">
    <delete dir="${codemodule.dir}" quiet="true" />
    <mkdir dir="${codemodule.dir}" />
    <copy todir="${codemodule.dir}">
        <fileset dir="${lib.dir}" includes="*.jar"/>
        <fileset dir="${basedir}" includes="${app-name}.jar"/>
    </copy>
    <move file="${codemodule.dir}/${app-name}.jar" tofile="${codemodule.dir}/0_${app-name}.jar"/>
    <Zip destfile="${codemodule.dir}/${app-name}-fat.jar" duplicate="preserve">
      <zipgroupfileset dir="${codemodule.dir}">
        <include name="*.jar"/>
      </zipgroupfileset>
    </Zip>

0
booFar