63 votes

Créer un bundle jar avec ant

J'utilise Ant pour construire quelques projets Java.
Dans certains, j'ai un lib/ qui contient les dépendances externes, sous la forme de fichiers JAR.

Pendant la construction, je crée un jar groupé, qui contient le code du projet, ainsi que les dépendances, en ajoutant au fichier jar groupé un fichier zipfileset pour chacun des bocaux dans le lib/ répertoire.

Le problème est qu'à chaque fois que j'ajoute un bocal, ou que je change de nom, je dois me rappeler de mettre à jour le fichier build.xml car je n'ai pas trouvé de moyen pour ajouter ces zipfilesets d'une manière automatique qui inclura tous les bocaux dans un certain modèle (par ex. lib/*.jar ).

Existe-t-il une meilleure façon de procéder ?

J'ai envisagé d'écrire ma propre tâche Ant pour cela, ou d'utiliser l'API Ant de Groovy pour le faire de manière programmatique, mais je me demandais s'il y avait un moyen de le faire en utilisant Ant "vanilla".

54voto

jonescb Points 5500

Dans ma cible, j'ai quelque chose comme ça :

<jar destfile="${store.dir}/temp_final.jar" filesetmanifest="skip">
    <zipgroupfileset dir="dist" includes="*.jar"/>
    <zipgroupfileset dir="dist/lib" includes="*.jar" excludes=""/>

    <manifest>
        <attribute name="Main-Class" value="${main.class}"/>
        <attribute name="Class-Path" value="${mf.classpath}"/>
    </manifest>
</jar>

Et voici comment je construis mon classpath :

<path id="build.classpath">
    <fileset dir="${basedir}/">
        <include name="${lib.dir}/*.jar"/>
    </fileset>
</path>

<pathconvert property="mf.classpath" pathsep=" ">
    <path refid="build.classpath"/>
    <mapper>
        <chainedmapper>
            <flattenmapper/>
            <globmapper from="*.jar" to="lib/*.jar"/>
        </chainedmapper>
    </mapper>
</pathconvert>

mf.classpath est utilisé à partir du paquet cible posté ci-dessus. Cette partie a été copiée d'un autre endroit, donc je ne suis pas très familier avec elle.

Modification rapide. Javac doit aussi connaître ces bocaux.

<path id="jars">
    <fileset dir="${lib.dir}" includes="**/*.jar"/>
</path>

<target name="compile">
    <mkdir dir="${build.dir}"/>
    <javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="jars" debug="on"/>
</target>

31voto

Jason Day Points 5624

Utilisez un zipgroupfileset . Par exemple :

<target name="jar">
    <jar destfile="foo.jar" basedir="${dir.classes}">
        <zipgroupfileset dir="lib" includes="*.jar"/>
    </jar>
</target>

El zipgroupfileset est documenté avec le Zip tâche.

10voto

Pour ceux d'entre vous qui utilisent NetBeans, voici comment créer une archive JAR avec des bibliothèques regroupées à l'aide de zipgroupfileset :

<target name="-post-jar">

    <property name="store.jar.name" value="MyJarName"/>

    <property name="store.dir" value="dist"/>
    <property name="store.jar" value="${store.dir}/${store.jar.name}.jar"/>

    <echo message="Packaging ${application.title} into a single JAR at ${store.jar}"/>

    <jar destfile="${store.dir}/temp_final.jar" filesetmanifest="skip">
        <zipgroupfileset dir="dist" includes="*.jar"/>
        <zipgroupfileset dir="dist/lib" includes="*.jar"/>

        <manifest>
            <attribute name="Main-Class" value="${main.class}"/>
        </manifest>
    </jar>

    <zip destfile="${store.jar}">
        <zipfileset src="${store.dir}/temp_final.jar"
        excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/>
    </zip>

    <delete file="${store.dir}/temp_final.jar"/>
    <delete dir="${store.dir}/lib"/>
    <delete file="${store.dir}/README.TXT"/>
</target>

J'ai ajouté cette définition de cible à la fin du fichier build.xml. Le nom de la cible est -post-jar.

0voto

Dave Paroulek Points 6033

Voici un exemple simple d'une cible ant qui va créer un jar (nommé test.jar) qui inclut tous les fichiers jar sous le répertoire lib. Peut-être cela résoudra-t-il votre problème ?

<target name="jar">
    <jar destfile="test.jar">
        <fileset dir="lib/" includes="**/*.jar" />
    </jar>
</target>

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