Создание баночки с муравьем
Я использую Ant для создания некоторых проектов Java.
В некоторых у меня есть lib/
директория, которая содержит внешние зависимости, в виде файлов JAR.
Во время сборки я создаю jar-пакет, содержащий код проекта, а также зависимости, добавляя в jar-файл пакета a zipfileset
для каждой банки в lib/
каталог.
Проблема в том, что каждый раз, когда я добавляю банку или меняю имя, мне нужно помнить, чтобы обновить build.xml
файл, так как я не мог найти способ добавить эти zipfilesets
в автоматическом режиме, который будет включать все банки по определенному шаблону (например, lib/*.jar
).
Есть ли лучший способ сделать это?
Я подумывал написать для этого свою собственную задачу Ant или использовать Ant API Groovy для этого программно, но мне было интересно, есть ли способ сделать это с помощью "vanilla" ant.
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 используется из цели пакета, указанной выше. Эту часть я скопировал откуда-то еще, поэтому я не настолько знаком с ней.
Быстрое редактирование. Джаваку тоже нужно знать об этих банках.
<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>
Использовать zipgroupfileset
, Например:
<target name="jar">
<jar destfile="foo.jar" basedir="${dir.classes}">
<zipgroupfileset dir="lib" includes="*.jar"/>
</jar>
</target>
zipgroupfileset
задокументировано с задачей Zip.
Для тех из вас, кто использует 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.
Вот простой пример цели ant, которая создаст jar (с именем test.jar), который включает все файлы jar в каталоге lib. Может быть, это решит вашу проблему?
<target name="jar">
<jar destfile="test.jar">
<fileset dir="lib/" includes="**/*.jar" />
</jar>
</target>