【问题标题】:Upload file via Ant FTP task in Maven在 Maven 中通过 Ant FTP 任务上传文件
【发布时间】:2011-04-25 12:38:36
【问题描述】:

我正在尝试使用 Ant 任务上传文件。如果我直接使用 Ant 文件会被上传,但如果我通过 Maven 调用 ant 任务(使用 maven-antrun-plugin)我会收到以下错误:

An Ant BuildException has occurred: The following error occurred while execution 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 显然对 Ant 可用:

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

是否为 maven-antrun-plugin 单独定义了 Ant 类路径,还是我遗漏了什么?

【问题讨论】:

    标签: ant maven-2 ftp apache-commons-net


    【解决方案1】:

    正如 Pascal 提到的,ma​​ven-antrun-plugin 没有使用您的 $ANT_HOME 环境变量指定的 ant,他提到的配置可能是从纯 maven 的角度始终如一地做到这一点的最佳方法。

    但是,jar 可以存储在 $USER_HOME/.ant/lib 而不是 $ANT_HOME/lib 中,这些 jar 应该在任何实例的类路径中都可用由该用户运行的 ant。

    注意,您的 ant 脚本不能假定 jars 存在,并且 jars 仅在启动时放置在类路径中,因此如果脚本定义了一个设置目标以将 jars 下载到 $ USER_HOME/.ant/lib,那么这个目标必须在“单独的蚂蚁会话”中运行,然后再次调用以执行依赖于 jar 的任务。

    您可能从这种方法中获得的唯一潜在好处是 Ant 脚本可以从 maven 和 Ant 中运行。

    【讨论】:

      【解决方案2】:

      ant-commons-net.jar 显然对 Ant 可用

      是的,但是 Maven 和 maven-antrun-plugin 没有使用您的本地 Ant 安装。

      Ant 类路径是为maven-antrun-plugin 单独定义的,还是我遗漏了什么?

      使用 Ant 的默认 jar 中未包含的 Ant 任务的方法记录在 Using tasks not included in Ant's default jar 中(这肯定会有所帮助):

      使用 Ant 任务中未包含的 Ant jar,如 Ant 可选或自定义 任务 您需要添加依赖项 任务运行到 插件类路径并使用 maven.plugin.classpath参考如果 需要。

      <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>
      

      【讨论】:

      • 这是正确的方法。我建议做的唯一不同的事情是:1)将ant groupId 指定为org.apache.ant,因为这是 Maven 插件内部引用的内容。
      • 如果这是一个多模块项目,您还应该考虑将依赖项添加到根项目 pom 中的 pluginManagement 部分。这将防止您项目中对 antrun 的其他引用破坏您的依赖项。
      • @Tim 实际上,as of version 1.7.0ant-commons-netgroupIdorg.apache.ant,但上面的对于 1.6.5 版本是正确的。换句话说,如果您想使用更新的版本,请对其进行调整。对于pluginManagement 部分,您当然是对的。我会更新我的答案以提及...明天:) 感谢两位 cmets!
      【解决方案3】:

      有一个classpath 属性可以在maven-antrun-plugin&lt;tasks&gt; 部分中设置。

      例如,

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-17
        • 1970-01-01
        • 2012-04-26
        • 2013-03-24
        • 2012-07-29
        • 2010-11-18
        • 1970-01-01
        相关资源
        最近更新 更多