with tutorial compile classes ant jar classpath manifest

ant - tutorial - build xml java



Genere la ruta de clase manifiesta desde<classpath> en Ant (4)

En el archivo de compilación a continuación, el objetivo del jar se refiere a la propiedad jar.class.path para el manifiesto class-path. El objetivo de compilación se refiere a project.class.path

Aquí hay redundancia, porque jar.class.path y project.class.path son muy similares. Deben actualizarse cuando se agregan bibliotecas, lo que puede ser complicado si la lista de bibliotecas es muy larga. ¿Hay una mejor manera? Cualquier solución debe ser multiplataforma y usar siempre rutas relativas.

Editar:
Debe generar la ruta de clases JAR desde un conjunto de archivos y no al revés, así que puedo usar comodines para incluir, por ejemplo, todos los archivos JAR en un directorio.

<?xml version="1.0"?> <project name="Higgins" default="jar" basedir="."> <property name="jar.class.path" value="lib/forms-1.2.0.jar lib/BrowserLauncher.jar"/> <path id="project.class.path"> <pathelement location="build"/> <fileset dir="lib"> <include name="forms-1.2.0.jar"/> <include name="BrowserLauncher.jar"/> </fileset> </path> <target name="prepare"> <mkdir dir="build"/> </target> <target name="compile" depends="prepare" description="Compile core sources"> <javac srcdir="src" includes="**" destdir="build" debug="true" source="1.5"> <classpath refid="project.class.path"/> </javac> </target> <target name="jar" depends="compile" description="Generates executable jar file"> <jar jarfile="higgins.jar"> <manifest> <attribute name="Main-Class" value="nl.helixsoft.higgins.Main"/> <attribute name="Class-Path" value="${jar.class.path}"/> </manifest> <fileset dir="build" includes="**/*.class"/> <fileset dir="src" includes="**/*.properties"/> </jar> </target> </project>


Puede usar <pathconvert> para convertir una ruta (que puede contener un conjunto de archivos) en una cadena simple. Es probable que necesite <echo> esa cadena a un archivo, utilice <replace> o <replaceregexp> para cortar los bits de la ruta principal, y finalmente use <loadfile> para cargar la cadena manipulada en la propiedad final.

Implementación dejada como un ejercicio para el lector.


Si solo desea un subpaso común compartido entre dos (o más) rutas, eso es fácil de hacer:

<path id="lib.path> <fileset dir="lib"> <include name="forms-1.2.0.jar"/> <include name="BrowserLauncher.jar"/> </fileset> </path> <path id="project.class.path"> <pathelement location="build"/> <path refid="lib.path"/> </path> <property name="jar.class.path" refid="lib.path"/>

EDITAR Lo siento, he entendido mal la pregunta. Prueba esto:

<property name="jar.class.path" value="lib/forms-1.2.0.jar lib/BrowserLauncher.jar"/> <path id="project.class.path"> <pathelement location="build"/> <fileset dir="." includes="${jar.class.path}"/> </path>


Suponiendo Ant 1.7 o superior, puede usar la tarea manifestclasspath .

<path id="dep.runtime"> <fileset dir="./lib"> <include name="**/*.jar" /> </fileset> </path> <property name="dep_cp" value="${toString:dep.runtime}" /> <target name="default"> <manifestclasspath property="manifest_cp" jarfile="myjar.jar"> <classpath refid="dep.runtime" /> </manifestclasspath> <echo message="Build Classpath: ${dep_cp}" /> <echo message="Manifest Classpath: ${manifest_cp}" /> </target>


<path id="build.classpath"> <fileset dir="${basedir}"> <include name="lib/*.jar"/> </fileset> </path> <pathconvert property="manifest.classpath" pathsep=" "> <path refid="build.classpath"/> <mapper> <chainedmapper> <flattenmapper/> <globmapper from="*.jar" to="lib/*.jar"/> </chainedmapper> </mapper> </pathconvert> <target depends="compile" name="buildjar"> <jar jarfile="${basedir}/${test.jar}"> <fileset dir="${build}" /> <manifest> <attribute name="Main-Class" value="com.mycompany.TestMain"/> <attribute name="Class-Path" value="${manifest.classpath}"/> </manifest> </jar> </target>

Para obtener más información, consulte este artículo .