Search code examples
antmaven-2ftpapache-commons-net

Upload file via Ant FTP task in Maven


I'm trying to upload a file using an Ant task. If I use Ant directly the file is uploaded, but if I call the ant task via Maven (using the maven-antrun-plugin) I get the following error:

An Ant BuildException has occured: The following error occurred while executing this line:

/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

ant-commonsnet.jar is clearly available to Ant:

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

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


Solution

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

    Yes, but Maven and the maven-antrun-plugin is not using your local Ant install.

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

    The way to use Ant Tasks not included in Ant's default jar is documented in Using tasks not included in Ant's default jar (which should definitely help):

    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>