web-dev-qa-db-fra.com

Création d'un bocal avec fourmi

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

Lors de la construction, je crée un fichier jar groupé, qui contient le code du projet, avec les dépendances, en ajoutant au fichier jar bundle un zipfileset pour chacun des jars du lib/ répertoire.

Le problème est que chaque fois que j'ajoute un bocal ou que je change de nom, je dois me souvenir de mettre à jour le build.xml fichier, car je n'ai pas pu trouver un moyen d'ajouter ces zipfilesets d'une manière automatique qui inclura tous les pots dans un certain modèle (par exemple 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 fourmi de Groovy pour le faire par programme, mais je me demandais s'il y avait un moyen de le faire en utilisant la fourmi "Vanilla".

62
abyx

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 chemin de classe:

<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 de la cible de package publiée ci-dessus. J'ai copié cette partie ailleurs, donc je ne la connais pas du tout.

Edition rapide. Javac doit également 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>
53
jonescb

Utilisez un zipgroupfileset. Par exemple:

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

Le zipgroupfileset est documenté avec la tâche Zip .

29
Jason Day

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 cible à la fin du fichier build.xml. Le nom cible est -post-jar.

8
user725434

Voici un exemple simple d'une cible de fourmi qui créera un fichier jar (nommé test.jar) qui inclut tous les fichiers jar sous le répertoire lib. Peut-être que cela résoudra votre problème?

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