2010-10-14 5 views
6

Estoy tratando de cargar un archivo usando una tarea Ant. Si utilizo Ant directamente subido el archivo, pero si llamo a la tarea ant través de Maven (utilizando el maven-antrun-plugin) me sale el siguiente error:Subir archivo a través de la tarea Ant FTP en Maven

una hormiga BuildException ha ocurrido: Se ha producido el siguiente error durante la ejecución de esta línea:

/home/me/proj/build.xml:15: Problem: failed to create task or type ftp 
Cause: the class org.apache.tools.ant.taskdefs.optional.net.FTP was not found. 
    This looks like one of Ant's optional components. 
Action: Check that the appropriate optional JAR exists in 
    -ANT_HOME/lib 

hormiguero commonsnet.jar es claramente disponible a Ant:

$ ls $ANT_HOME/lib | grep ant-commons-net 
ant-commons-net.jar 

es la ruta de clase Ant definido por separado para maven-antRun-plugin, o me estoy perdiendo algo?

Respuesta

4

ant-commons-net.jar is clearly available to Ant

Sí, pero Maven y el maven-antrun-plugin no está usando su Hormiga instalación local.

Is the Ant classpath defined separately for maven-antrun-plugin , or am I missing something?

La manera de utilizar las tareas Ant no incluidos en el tarro por defecto de hormiga se documenta en Using tasks not included in Ant's default jar (que sin duda debe ayudar):

To use Ant tasks not included in the Ant jar, like Ant optional or custom tasks you need to add the dependencies needed for the task to run to the plugin classpath and use the maven.plugin.classpath reference if needed.

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <artifactId>my-test-app</artifactId> 
    <groupId>my-test-group</groupId> 
    <version>1.0-SNAPSHOT</version> 

    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-antrun-plugin</artifactId> 
     <version>1.6</version> 
     <executions> 
      <execution> 
      <id>ftp</id> 
      <phase>deploy</phase> 
      <configuration> 
       <target> 

       <ftp action="send" server="myhost" remotedir="/home/test" userid="x" password="y" depends="yes" verbose="yes"> 
        <fileset dir="${project.build.directory}"> 
        <include name="*.jar" /> 
        </fileset> 
       </ftp> 

       <taskdef name="myTask" classname="com.acme.MyTask" classpathref="maven.plugin.classpath"/> 
       <myTask a="b"/> 

       </target> 
      </configuration> 
      <goals> 
       <goal>run</goal> 
      </goals> 
      </execution> 
     </executions> 
     <dependencies> 
      <dependency> 
      <groupId>commons-net</groupId> 
      <artifactId>commons-net</artifactId> 
      <version>1.4.1</version> 
      </dependency> 
      <dependency> 
      <groupId>ant</groupId> 
      <artifactId>ant-commons-net</artifactId> 
      <version>1.6.5</version> 
      </dependency> 
      <dependency> 
      <groupId>ant</groupId> 
      <artifactId>ant-nodeps</artifactId> 
      <version>1.6.5</version> 
      </dependency> 
     </dependencies> 
     </plugin> 
    </plugins> 
    </build> 
</project> 
+0

Este es el enfoque correcto. Las únicas cosas que sugeriría hacer de forma diferente es: 1) especificar el 'group'd Id del grupo en su lugar como' org.apache.ant' ya que esto es lo que los plugins de Maven hacen referencia internamente. –

+1

Si se trata de un proyecto de varios módulos, también debería considerar agregar las dependencias a una sección de administración de complementos dentro del proyecto raíz pom. Esto evitará que otras referencias a antrun en su proyecto afecten sus dependencias. –

+0

@Tim De hecho, [a partir de la versión 1.7.0] (http://mvnrepository.com/artifact/org.apache.ant/ant-commons-net) de 'ant-commons-net', el' groupId' es 'org.apache.ant' pero el anterior es correcto para la versión 1.6.5. En otras palabras, adáptelo si desea usar una versión más reciente. Y, por supuesto, tienes razón sobre la sección 'pluginManagement'.Actualizaré mi respuesta para mencionar que ... mañana :) ¡Gracias por ambos comentarios! –

0

Hay una propiedad classpath que se puede establecer en la sección <tasks> de maven-antrun-plugin.

Por ejemplo,

<property name="classpath" refid="maven.compile.classpath"/> 
1

Como Pascal ha mencionado, el experto-antRun-plugin no está usando la hormiga especificada por su $ ANT_HOME variable de entorno, y la configuración que ha mencionado es probablemente la mejor manera de hacerlo consistentemente desde una perspectiva puramente maven.

Sin embargo, la jarra se puede almacenar en $ user_home/.ant/lib en lugar de $ ANT_HOME/lib, estos recipientes deben estar disponibles en la ruta de clase para cualquier instancia de hormiga que está a cargo de dicho usuario.

Nota que su script hormiga no puede asumir que los frascos están presentes, y que los frascos solamente se colocan en la ruta de clase en el arranque, por lo que si la secuencia de comandos define un objetivo de la disposición de transferir los frascos en $ user_home/.ant/lib, entonces este objetivo debería ejecutarse en una "sesión-ant-separada" antes y se invoca de nuevo para ejecutar la tarea que depende del contenedor.

El único beneficio potencial que puede derivar de este enfoque es que el script Ant puede ejecutarse desde maven y Ant.

Cuestiones relacionadas