java - how - Ant no puede encontrar una clase necesaria para una taskdef definida externamente
compile with ant (6)
Intento utilizar la tarea ant-axis axis-java2wsdl para crear un wsdl de una de mis clases java, pero no puedo hacer que la ruta de clases sea correcta.
Estoy usando el paquete libaxis-java de Ubuntu que instala axis-ant.jar en $ ANT_HOME / lib y axis.jar en / usr / share / java. Las partes interesantes de mi build.xml se ven así:
<property name="library.dir" value="lib"/>
<property name="system.library.dir" value="/usr/share/java"/>
<path id="libraries">
<fileset dir="${library.dir}">
<include name="*.jar"/>
</fileset>
<fileset dir="${system.library.dir}">
<include name="*.jar"/>
</fileset>
</path>
<target name="genwsdl" depends="compile">
<taskdef resource="axis-tasks.properties" classpathref="libraries"/>
<axis-java2wsdl>
details omitted
</axis-java2wsdl>
</target>
Ejecución de los resultados ant genwsdl
en:
/build.xml:50: taskdef A class needed by class
org.apache.axis.tools.ant.wsdl.Wsdl2javaAntTask
cannot be found: org/apache/axis/utils/DefaultAuthenticator
Ant es capaz de encontrar la definición de la tarea axis-java2wsdl, porque axis-ant.jar está en $ ANT_HOME / lib, pero no puede encontrar clases en axis.jar, aunque ese jar esté en la ruta definida por "libraries"
Sé que es un problema de classpath porque pude pasar DefaultAuthenticator a otra clase no encontrada al enlazar axis.jar en $ ANT_HOME / lib. ¿Cómo puedo hacer que taskdef reconozca los archivos jar en / usr / share / lib o el directorio lib local de mi proyecto sin enlazar todo en $ ANT_HOME / lib?
EDITAR:
Finalmente pude generar con éxito el wsdl con esta línea:
ant -lib /usr/share/java/axis.jar -lib /usr/share/java/jaxrpc.jar -lib /usr/share/java/wsdl4j.jar -lib /usr/share/java/commons-logging.jar -lib /usr/share/java/commons-discovery.jar -lib build genwsdl
Todavía apreciaría mucho si alguien pudiera decirme qué estoy haciendo mal al no poder definir esas bibliotecas en build.xml
¿Por qué no simplemente tomar la opción más simple y especificar el classpath en su <taskdef>
?
<taskdef resource="axis-tasks.properties">
<classpath>
<fileset file="/path/to/axis/jars"/>
</classpath>
</taskdef>
¿O crear una segunda entrada <classpath>
que subconjuntos library.dir
?
<path id="axis-tools-classpath">
<fileset dir="/path/to/axis/home">
<include name="*.jar"/>
</fileset>
<path refid="library.dir"/>
</path>
${ant.home}/lib
con ${ant.home}/lib
no es una buena idea y casi siempre se puede evitar.
El mecanismo Ant para agregar bibliotecas es:
- a través del argumento de línea de comando -lib
- agregando $ {user.home} /. ant / lib
- agregando $ {ant.home} / lib
Solamente. El manual no menciona nada sobre el uso de la propiedad system.library.dir . Probablemente es prácticamente ignorado para este propósito.
Además, ejecute hormiga en modo detallado (y -verbose) para ver qué está haciendo debajo del capó.
En general, esto funciona. Pero necesita verificar muy cuidadosamente qué clases están donde.
Si su clase de tarea se puede cargar en un cargador de clases más arriba en la jerarquía del cargador de clases (como CLASSPATH o ANT_HOME / lib) entonces su classpathref simplemente será ignorado .
Lea la entrada de preguntas frecuentes para más detalles.
La implementación del cargador de clases de Ant usa el modelo de delegación de Java
La clase ClassLoader usa un modelo de delegación para buscar clases y recursos. Cada instancia de ClassLoader tiene un cargador de clases principal asociado. Cuando se le solicite que encuentre una clase o recurso, una instancia de ClassLoader delegará la búsqueda de la clase o recurso en su cargador de clases principal antes de intentar encontrar la clase o el recurso en sí. El cargador de clases integrado de la máquina virtual, llamado cargador de clases de arranque, no tiene un padre pero puede servir como padre de una instancia de ClassLoader.
Nota: ejecutar ant -diagnostics
puede ser útil .
Me sirve para especificar el classpath directamente en la tarea taskdef, como lo mencionó matt b . Para mi proyecto, me parece útil incluir la biblioteca taskdef en la carpeta del proyecto y especificar el classpath en el archivo de compilación ant, para simplemente configurarlo en otras PC de desarrollo. Yo uso el siguiente taskdef:
<taskdef resource="antenna.properties" classpath="${myprojectroot}/lib/antenna-bin-1.2.1-beta.jar"/>
Tenga en cuenta que esto puede no funcionar para las versiones de ant anteriores a 1.7.0.
Usando las respuestas de aquí y toda la información parcial, se me ocurrió una solución. Agregué el archivo tar el archivo ant necesario para una carpeta lib en el proyecto (específicamente los controladores jdbc de mysql). Luego ejecuto una tarea de instalación en la hormiga que copia en la carpeta de inicio .ant / lib del usuario, y luego falla y aparece un mensaje para reiniciar. Solo falla una vez para un usuario y luego funciona todo el tiempo. Puede ser complicado si actualiza el archivo jar a una nueva versión ...
Aquí está la hormiga build.xml:
<project name="data_source" default="build">
<!-- BUILD PROPERTIES -->
<property file="build.properties"/>
<!-- SQL Server Properties -->
<property name="sql.driver" value="org.gjt.mm.mysql.Driver"/>
<property name="sql.url" value="jdbc:mysql://127.0.0.1/datastore"/>
<property name="sql.user" value="user"/>
<property name="sql.pass" value="password"/>
<!-- FILE LOCATIONS -->
<property name="sql.dir" location="sql"/>
<!-- INITIALIZE PROJECT -->
<target name="init" description="Initialize the project">
<available property="no.ant.lib.dir" file="${user.home}/.ant/lib/" type="dir" />
</target>
<!-- SETUP MYSQL -->
<target name="setup_mysql" description="Copy the lib so ant can see it" unless="no.ant.lib.dir">
<mkdir dir="${user.home}/.ant"/>
<mkdir dir="${user.home}/.ant/lib"/>
<copy file="lib/mysql-connector-java-5.1.13-bin.jar" todir="${user.home}/.ant/lib"/>
<!-- ant already missed picking up the jar - we have to restart -->
<fail message="JDBC mysql class copied to ${user.dir}/.ant/lib/ - please restart ant" />
</target>
<!-- BUILD DATA SOURCES -->
<target name="build" depends="init,setup_mysql,clean_data" description="Create and populate tables">
<sql driver="${sql.driver}" url="${sql.url}" userid="${sql.user}" password="${sql.pass}" >
<transaction src="${sql.dir}/create_tables.sql"/>
<transaction src="${sql.dir}/insert_data.sql"/>
</sql>
</target>
<!-- CLEAN PROJECT -->
<target name="clean" description="Cleans up project build">
<!-- Don''t clean data sources here - may get called by accident -->
</target>
<!-- Delete all tables and data -->
<target name="clean_data" description="Deletes all data and tables">
<echo>Dropping all database tables in ${sql.schema}...</echo>
<property name="exec.command" value="mysqldump -u${sql.user} -p${sql.pass} --add-drop-table --no-data ${sql.schema} | grep ^DROP | mysql -u${sql.user} -p${sql.pass} ${sql.schema}" />
<exec executable="sh">
<arg value = "-c"/>
<arg value="${exec.command}"/>
</exec>
</target>
</project>
Espero que esto ayude
Me encontré con el mismo problema cuando copié * .jar a {ant.home} / libs, luego uso user -lib para localizar el * .jar, ¡funciona bien! Considero que los nuevos frascos no se pueden cargar, ¡entonces lo probaré!