with tutorial how generar con compile java ant jar

java - tutorial - Creando un paquete de jar con hormiga



generar jar con ant (4)

Aquí hay un ejemplo simple de un objetivo ant que creará un jar (llamado test.jar) que incluye todos los archivos jar bajo el directorio lib. Tal vez esto resolverá tu problema?

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

Estoy usando Ant para construir algunos proyectos de Java.
En algunos, tengo un directorio lib/ , que contiene dependencias externas, en forma de archivos JAR.

Durante la compilación, creo un jar incluido, que contiene el código del proyecto, junto con las dependencias, al agregar al archivo jar jar un archivo zipfileset para cada uno de los jar en el directorio lib/ .

El problema es que cada vez que agrego un contenedor o cambio de nombre, debo recordar actualizar el archivo build.xml , ya que no pude encontrar una manera de agregar esos zipfilesets de manera automática que incluya todos los zipfilesets un cierto patrón (por ejemplo, lib/*.jar ).

¿Hay una mejor manera de hacer esto?

He considerado escribir mi propia Ant Task para esto, o usar la ant API de Groovy para hacer esto programáticamente, pero me preguntaba si hay una forma de hacerlo usando la hormiga "vainilla".


En mi objetivo, tengo algo como esto:

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

Y aquí es cómo construyo mi classpath:

<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 se utiliza desde el destino del paquete publicado anteriormente. Esta parte la copié de otra parte, así que no estoy tan familiarizado con ella.

Edición rapida. Javac necesita saber acerca de esos frascos también.

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


Para aquellos de ustedes que usan NetBeans, aquí están cómo pueden crear archivos JAR con bibliotecas incluidas usando 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>

He agregado esta definición de destino al final del archivo build.xml. El nombre del objetivo es -post-jar.


Use un zipgroupfileset . Por ejemplo:

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

El zipgroupfileset está documentado con la tarea Zip .