java - tutorial - build.xml ant
ant, archivos jar, y Class-Path oh my (6)
Con ant 1.7 y después, la tarea manifestclasspath es el camino a seguir. Si está utilizando una versión de ant antes de 1.7, la tarea manifestclasspath no existe.
Lo siguiente da el mismo resultado:
<path id="build.classpath">
<fileset dir="${dist}/lib">
<include name="*.jar" />
<exclude name="myprog.jar" />
</fileset>
</path>
<pathconvert property="lib.list" pathsep=" ">
<path refid="build.classpath" />
<mapper>
<chainedmapper>
<flattenmapper />
</chainedmapper>
</mapper>
</pathconvert>
<target name="generate.jar">
<jar destfile="${dist}/lib/myprog.jar">
<manifest>
<attribute name="Main-Class"
value="com.mypackage.MyClass" />
<attribute name="Class-Path" value="${manifest.classpath}" />
</manifest>
</jar>
</target>
Estoy tratando de rearchitect mi técnica de compilación para crear archivos jar de Java que dependen de archivos jar de terceros comunes. (Listas de glaseados, Apache Commons, etc.)
Los había echado a todos en {Java JRE dir} / lib / ext para que el JRE los viera automáticamente, pero eso me llevó a problemas como no recordar que necesito distribuir ciertos archivos jar, así que me gustaría aprender para ser mas explícito
Así que los moví a todos en c: / appl / java / common /, los agregué a la ruta de compilación de Eclipse, y definí esto en mi archivo ant:
<path id="javac_classpath">
<fileset dir="${libDir}">
<include name="*.jar"/>
</fileset>
<fileset dir="c:/appl/java/common">
<include name="*.jar"/>
</fileset>
</path>
Tengo mi encabezado de manifiesto Class-Path establecido en "." en mi tarea jar
, pero eso no parece funcionar incluso si pongo los archivos jar relevantes en el mismo directorio que el archivo jar de mi aplicación. Puedo agregarlos todos manualmente uno a uno al encabezado Class-Path, pero me pregunto si hay una forma más fácil de configurar correctamente el encabezado Class-Path.
El encabezado de manifiesto Class-Path para archivos jar requiere que se enumeren explícitamente los archivos jar que desea incluir. Listado de un directorio en la ruta de clase significa que java buscará archivos .class en ese directorio, no archivos jar.
Esto es todo lo que necesitas:
<path id="build-classpath">
<fileset dir="${dist}/lib">
<include name="*.jar"/>
</fileset>
</path>
<manifestclasspath property="lib.list" jarfile="${dist}/lib/myprog.jar">
<classpath refid="build-classpath"/>
</manifestclasspath>
<jar jarfile="${dist}/lib/myprog.jar"
basedir="${build}"
includes="com/my/prog/**" >
<manifest>
<attribute name="Main-Class" value="com.my.prog.MyProg"/>
<attribute name="Class-Path" value="${lib.list}"/>
</manifest>
</jar>
Como probablemente pueda ver, se supone que ha compilado sus clases de Java y las ha generado en ${build}
. También supone que has copiado tus archivos jar a ${dist}/lib
.
Dicho esto, valdría la pena buscar en otros sistemas de compilación que tengan soporte incorporado para dependencias, como Maven y Gradle. Estos otros sistemas de compilación ya han pensado en muchas estructuras de proyectos y operaciones de compilación comunes, por lo que no tiene que escribir todo hasta el último detalle.
Lo que quieres es un mapper . Flattenmapper es probablemente el más fácil, pero esencialmente necesita crear un elemento de ruta que especifique su ruta de clase, luego use un convertidor de ruta en él para convertirlo en una cadena que pueda incluirse en su manifiesto.
Editar: puede usar las reglas de inclusión para construir el elemento de ruta, por lo que todo en un directorio que termina con jar sería **/*.jar
Los directorios de Classpath no incluyen, de forma predeterminada, archivos Jar por razones de seguridad. Alguien podría colocar un archivo jar allí, y podría cargarse, anulando su código, sin su conocimiento. Sé que hubo una discusión sobre la adición de otra bandera o el token final para permitir que los archivos Jar se agreguen a la ruta de clases, pero, si mi memoria sirve, está programado para la versión 7. Sin embargo, podría estar equivocado en la última parte.
Ya que estás en Ant, probablemente no quieras cambiar, pero Maven es bastante bueno en identificar todas tus dependencias, y tiene varias facilidades para copiar o combinar tus archivos de bibliotecas juntos con fines de distribución. Para mis propósitos, tengo un complemento de Maven que crea un script de ejecución durante la compilación, que a su vez establece el classpath para mí, así que no tengo que preocuparme por eso.