ant ftp

ant - ¿Cómo cargar una tarea opcional en hormiga sin-lib o instalación global?



ftp (6)

Quiero utilizar la tarea FTP en Ant, y he encontrado los archivos jar apropiados y todo funcionó bien. Puse los archivos jar en un directorio "libs" junto con otros archivos utilizados en la compilación. El único problema es que el usuario debe ejecutar "ant -lib commons-net-ftp-2.0.jar" para hacer una compilación; Realmente preferiría que fuera posible ejecutar "hormiga" sin argumentos.

Al leer la página de instalación de tareas opcional de la hormiga , veo que hay cinco maneras en que uno puede cargar bibliotecas adicionales en la hormiga, y ninguna de ellas es realmente lo que estoy buscando. No quiero obligar al usuario a hacer modificaciones en su sistema para ejecutar esta tarea; debería ser posible simplemente cargarlo desde el directorio "libs" dentro de la carpeta fuente de nuestro producto. Entonces eso significa que el CLASSPATH global también está fuera (lo cual es una mala idea).

La última opción, como se señala en la documentación, es el enfoque preferido ... cargar los archivos jar individualmente desde el script de compilación en sí. He hecho esto en el pasado con las tareas ant-contrib y JUnit, y me gustaría hacer eso aquí, pero no veo cómo puedo lograr esto. La tarea FTP no admite un elemento de ruta de clase anidado, y no conozco el recurso XML que necesitaría para cargar esta biblioteca a través de una tareadef. ¿Cómo puedo cargar las bibliotecas desde dentro de hormiga?

Editar: En respuesta a las respuestas y preguntas que se han publicado aquí hasta ahora, estoy usando hormiga 1.7.1. Hacer un taskdef ftp definitivamente no funciona; eso arroja el siguiente error:

BUILD FAILED /my/path/build.xml:13: taskdef class org.apache.tools.ant.taskdefs.optional.net.FTP no se puede encontrar

Quizás esto se deba a que el nombre de clase es incorrecto. ¿Cómo exactamente encuentro el nombre de clase que debo usar si solo tengo un archivo jar? No está documentado en ninguna parte, y no pude encontrar nada en el contenedor parecido a esa ruta.


¿Este trabajo supondrá que libs está directamente debajo del directorio base de tu proyecto?

<taskdef name="ftp" classname="org.apache.tools.ant.taskdefs.optional.net.FTP"> <classpath> <pathelement location="${basedir}/libs/commons-net-1.4.0.jar"/> </classpath> </taskdef>


Sus usuarios tienen todos instalados en sus máquinas, pero no puede / no quiere hacer que agreguen el contenedor FTP. ¿Puedes agrupar hormiga con tu proyecto para realizar tareas que llamen a TU paquete de hormigas, con los frascos colocados para que funcionen de la siguiente manera?

<taskdef name="ftp" classname="org.apache.tools.ant.taskdefs.optional.net.FTP"> <classpath> <pathelement location="/lib/commons-net-1.4.0.jar"/> </classpath> </taskdef> <target name="testFtp"> <ftp server="blah" userid="foo" password="bar"> <fileset file="test.file" /> </ftp> </target>


El problema que está teniendo es debido a los diferentes cargadores de clase en uso. Las clases de Net de Commons deben ser cargadas por el mismo cargador de clases que carga la tarea de FTP. Debido a que Ant carga la tarea FTP en el arranque, debe agregar Commons Net a Ant classpath para que sea cargada por el mismo cargador de clases. Es por eso que la documentación le da 4 formas diferentes de hacer esto.

Estoy de acuerdo en que ninguno de ellos es ideal (la variable de entorno CLASSPATH es la peor). Una forma de evitar esto es proporcionar un script de shell con su proyecto que invoca Ant y pasa el argumento apporpriate -lib. Luego haces que la gente use esto en lugar de invocar a Ant directamente. De hecho, puedes nombrarlo "hormiga" para que se ejecute en lugar de la "hormiga" existente en la ruta (esto solo funciona si el directorio actual está en la ruta, por delante de otros directorios).

La quinta opción en la documentación es genial en teoría. Finalmente arreglaron los problemas de carga de clases en 1.7.0. Desafortunadamente, como usted menciona, nadie adaptó retroactivamente la tarea FTP para tomar una ruta de clase. Puede intentar enviar una solicitud de mejora, pero esto no ayudará en el corto plazo.

Hay otra opción, que no es mejor que las demás. En lugar de asegurarse de que el cargador de clases carga las tareas de FTP carga las clases de Commons Commons, puede asegurarse de que la carga de FTP la cargue el cargador de clases que carga las clases Commons Net. Para hacerlo, debe eliminar el archivo ant-commons-lib.jar del directorio ''lib'' de la instalación Ant. Esto significa que la tarea FTP no se cargará al inicio. Esta es la razón por la cual las tareas opcionales se dividen en tantos JAR separados, de modo que se pueden eliminar individualmente. Coloque este archivo JAR junto al archivo Commons Net JAR para que pueda cargarse al mismo tiempo. Entonces puedes hacer algo como esto (lo intenté y funciona):

<taskdef name="ftp" classname="org.apache.tools.ant.taskdefs.optional.net.FTP"> <classpath> <pathelement location="${basedir}/lib/ant-commons-net.jar"/> <pathelement location="${basedir}/lib/commons-net-2.0.jar"/> </classpath> </taskdef> <ftp server="yourserver.com" userid="anonymous" password="blah"> <fileset dir="somedirectory"/> </ftp>

Pero esta es probablemente una opción peor que solo usar el modificador -lib (con o sin un script de envoltura). La única otra cosa en la que puedo pensar es tratar de encontrar una tarea de FTP de terceros para usar en lugar de la predeterminada.


Tengo una solución:

puede descargar una nueva tarea "classloader" de http://enitsys.sourceforge.net/ant-classloadertask/ y cargarla con:

<taskdef resource="net/jtools/classloadertask/antlib.xml" classpath="XXX/ant-classloadertask.jar"/>

Naw puede hacer cosas como cargar clases con el mismo cargador de clases que usa la hormiga para su tarea:

<classloader loader="system" classpath="XXX/commons-net-2.0.jar"/>

o "loader =" proyecto ""

Luego defines tu tarea:

<taskdef name="ftp" classname="org.apache.tools.ant.taskdefs.optional.net.FTP"/>

y ve :-)


Así que tuve éxito en hacer esto para the ant-salesforce.jar que obtienes cuando tratas de hacer un trabajo de Salesforce (diversión ...)

Compruebe si el archivo jar tiene un archivo xml que se parece a esto:

<antlib> <typedef name="compileAndTest" classname="com.salesforce.ant.CompileAndTest"/> .... </antlib>

Luego, en la hormiga, dale una tarea que lea ese archivo desde dentro del contenedor dado, así:

<taskdef resource="com/salesforce/antlib.xml" classpath="lib/ant-salesforce.jar" />

Espero que ayude a algunos.


Ah, amigo, esto es tan desagradable. Corro hormiga de eclipse. No quiero reconfigurar hormiga en eclipse para nuevos espacios de trabajo, así que esto es lo que decidí hacer, desacoplar la ejecución de la tarea y la configuración de la hormiga. Extraje la tarea ftp a un archivo de construcción separado. Luego agregué una llamada nativa a la línea de comando para comenzar un proceso de hormiga completamente nuevo con las bibliotecas requeridas en la ruta:

<target name="deploy-ftp"> <exec command="ant"> <arg line="-buildfile ftp.xml deploy-ftp -lib lib/ant"/> </exec> </target>

Ahora el archivo de compilación maestra se puede ejecutar sin ningún argumento especial y no se requieren modificaciones en la instalación de la hormiga. Sin embargo, es desagradable, ya que la tarea ftp se ejecuta en un entorno completamente limpio. Ninguna de las propiedades y rutas del archivo de compilación maestra están disponibles. Afortunadamente, tenía todos estos en un archivo de propiedades separado de todos modos, así que solo necesitaba una única importación.

Me gustaría agregar un gran agradecimiento a Dan Dyer. Sin su extensa explicación de lo que sucede detrás de escena, no habría encontrado esta solución.