Создание баночки с муравьем - PullRequest
62 голосов
/ 30 ноября 2009

Я использую Ant для создания некоторых проектов Java.
В некоторых у меня есть каталог lib/, который содержит внешние зависимости, в виде файлов JAR.

Во время сборки я создаю пакет jar, который содержит код проекта, а также зависимости, добавляя в файл jar комплекта zipfileset для каждого из jar в каталоге lib/.

Проблема в том, что каждый раз, когда я добавляю банку или изменяю имена, мне нужно помнить, чтобы обновлять файл build.xml, так как я не мог найти способ добавления этих zipfilesets в автоматическом режиме, который будет включать все банки в определенном порядке (например, lib/*.jar).

Есть ли лучший способ сделать это?

Я подумывал написать для этого свою собственную задачу Ant или использовать API Ant Groovy для этого программным путем, но мне было интересно, есть ли способ сделать это с помощью "vanilla" ant.

Ответы [ 4 ]

53 голосов
/ 30 ноября 2009

В моей цели у меня есть что-то вроде этого:

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

А вот как я строю свой путь к классам:

<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 используется из цели пакета, указанной выше. Эту часть я скопировал откуда-то еще, поэтому я не настолько знаком с ней.

Быстрое редактирование. Джаваку тоже нужно знать об этих банках.

<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>
29 голосов
/ 06 декабря 2009

Используйте zipgroupfileset. Например:

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

zipgroupfileset задокументировано с задачей Zip .

7 голосов
/ 29 марта 2012

Для тех из вас, кто использует NetBeans, вот как вы можете создать JAR-архив с библиотеками, связанными с помощью 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>

Я добавил это определение цели в конец файла build.xml. Целевое имя -post-jar.

1 голос
/ 30 ноября 2009

Вот простой пример цели ant, которая создаст jar (с именем test.jar), который включает все файлы jar в каталоге lib. Может быть, это решит вашу проблему?

<target name="jar">
    <jar destfile="test.jar">
        <fileset dir="lib/" includes="**/*.jar" />
    </jar>
</target>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...