Создание баннера с ant
Я использую Ant для создания некоторых Java-проектов.
В некоторых случаях у меня есть каталог lib/
, который содержит внешние зависимости, в форме в файлах JAR.
Во время сборки я создаю объединенную банку, которая содержит код проекта, наряду с зависимостями, добавляя к jar файлу пакета a zipfileset
для каждой из банок в каталоге lib/
.
Проблема заключается в том, что каждый раз, когда я добавляю банку или изменяю имена, мне нужно помнить об обновлении файла build.xml
, поскольку я не мог найти способ для добавления этих zipfilesets
автоматически, будет включать все банки в определенном шаблоне (например, lib/*.jar
).
Есть ли лучший способ для этого?
Я подумал о написании своей собственной Ant задачи для этого или с помощью Groovy Ant API для этого программно, но задавался вопросом, есть ли способ сделать это с помощью "vanilla" ant.
Ответы
Ответ 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>