Подтвердить что ты не робот

Создание баннера с ant

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

zipgroupfileset документируется с помощью задачи Zip.

Ответ 3

Для тех, кто использует 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.

Ответ 4

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

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