Создание пакета jar с помощью ant

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

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

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

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

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


person abyx    schedule 30.11.2009    source источник


Ответы (4)


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

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

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

<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>
person jonescb    schedule 30.11.2009
comment
Вот метод, аналогичный методу jonescb, содержащий последний build.xml (большая картинка), который отсутствует в этом ответе: mkyong.com/ant/ant-create-a-fat-jar-file - person Stephan; 01.07.2015

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

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

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

person Jason Day    schedule 06.12.2009
comment
Как ответил jonescb, это действительно решение. Никогда не видел, так как он спрятан в задании Zip - person abyx; 06.12.2009
comment
Большая проблема с этим заключается в том, что в файлах jar есть дополнительные файлы, обычно в каталоге MANIFEST. Например, многие из jar-файлов spring framework содержат файлы spring.handlers, spring.schemas и spring.tooling, которые ... ну, я не понял, как справиться с этим ... слиянием? - person ticktock; 10.05.2014
comment
@GeorgeBaxter Искал то же самое и в итоге сделал это. Сообщите мне, если найдете лучшее решение. - person Sithsu; 06.06.2014
comment
Спасибо @Sithsu. Я также выкатил свое собственное решение здесь, хотя кому-то мой вопрос почему-то не понравился ... - person ticktock; 17.06.2014
comment
Самый простой и совершенный. Это лучшее решение, чем выбранный ответ. Спасибо. - person José Cabo; 21.05.2015

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

person Community    schedule 29.03.2012
comment
Работает спасибо! Я только что изменил путь в этой строке с помощью каталога моего jar: ‹zipgroupfileset dir = dist / lib includes = *. Jar /› - person matt; 25.04.2018

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

<target name="jar">
    <jar destfile="test.jar">
        <fileset dir="lib/" includes="**/*.jar" />
    </jar>
</target>
person Upgradingdave    schedule 30.11.2009
comment
хммм, наверное, нет, я думал о войнах и веб-приложениях, а не о банках, извините за это. - person Upgradingdave; 30.11.2009