6

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

发生 Ant BuildException:执行此行时发生以下错误:

/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

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

4

3 回答 3

5

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

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

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

使用 Ant 的默认 jar 中未包含的任务的方法记录在使用Ant 的默认 jar 中未包含的任务(这肯定会有所帮助):

要使用 Ant jar 中未包含的 Ant 任务,例如 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>
于 2010-10-14T19:08:47.740 回答
1

正如 Pascal 所提到的,maven-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 运行。

于 2010-10-14T19:43:57.427 回答
0

有一个classpath属性可以<tasks>maven-antrun-plugin.

例如,

<property name="classpath" refid="maven.compile.classpath"/>
于 2010-10-14T17:29:17.557 回答