2010-10-14 31 views
6

Tôi đang cố tải lên tệp bằng tác vụ Ant. Nếu tôi sử dụng Ant trực tiếp thì tệp được tải lên, nhưng nếu tôi gọi nhiệm vụ kiến ​​qua Maven (sử dụng số maven-antrun-plugin) tôi nhận được lỗi sau:Tải tệp lên qua tác vụ Ant FTP trong Maven

10 An Ant BuildException đã xảy ra: Đã xảy ra lỗi sau khi thực hiện dòng này:

/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 rõ ràng là có sẵn cho Ant:

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

là classpath Ant xác định riêng cho maven-antrun-plugin, hoặc tôi đang thiếu cái gì?

Trả lời

4

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

Có, nhưng Maven và maven-antrun-plugin không được sử dụng Ant địa phương của bạn cài đặt.

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

Cách sử dụng Nhiệm vụ Ant không được đưa vào jar mặc định của Ant được ghi chép lại trong Using tasks not included in Ant's default jar (mà chắc chắn sẽ giúp):

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

Đây là phương pháp phù hợp. Những điều duy nhất tôi sẽ đề nghị làm khác là: 1) chỉ định 'ant' groupId thay vì' org.apache.ant' vì đây là những gì Maven plugins tham chiếu nội bộ. –

+1

Nếu đây là một dự án đa mô-đun, bạn cũng nên xem xét việc thêm phụ thuộc vào phần pluginManagement trong dự án gốc pom. Điều này sẽ ngăn chặn các tham chiếu khác để antrun trong dự án của bạn từ clobbering phụ thuộc của bạn. –

+0

@Tim Thật vậy, [kể từ phiên bản 1.7.0] (http://mvnrepository.com/artifact/org.apache.ant/ant-commons-net) của 'ant-commons-net',' groupId' là 'org.apache.ant' nhưng cái trên là đúng cho phiên bản 1.6.5. Nói cách khác, hãy điều chỉnh nó nếu bạn muốn sử dụng phiên bản mới hơn. Và tất nhiên bạn hoàn toàn đúng về phần 'pluginManagement'.Tôi sẽ cập nhật câu trả lời của tôi để đề cập đến rằng ... ngày mai :) Cảm ơn cho cả hai ý kiến! –

0

Có một tài sản classpath có thể được đặt trong <tasks> phần của maven-antrun-plugin.

Ví dụ,

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

Như Pascal đã đề cập, các maven-antrun-plugin không sử dụng kiến ​​được chỉ định bởi biến môi trường $ ANT_HOME của bạn và cấu hình mà anh ta đề cập có lẽ là cách tốt nhất để làm điều đó một cách nhất quán từ góc nhìn thuần túy của maven.

Tuy nhiên, jar có thể được lưu trữ trong $ USER_HOME/.ant/lib thay vì $ ANT_HOME/lib, những lọ nên có sẵn trên classpath cho bất kỳ trường hợp kiến ​​mà được điều hành bởi người dùng đó.

Lưu ý rằng tập lệnh kiến ​​của bạn không thể giả định rằng các bình có mặt và các lọ chỉ được đặt trên đường dẫn lớp khi khởi động, vì vậy nếu tập lệnh xác định mục tiêu thiết lập để tải các lọ xuống $ USER_HOME/.ant/lib, sau đó mục tiêu này sẽ phải được chạy trong một "riêng biệt-ant-phiên", trước và được gọi một lần nữa để thực hiện nhiệm vụ phụ thuộc vào jar.

Lợi ích tiềm năng duy nhất mà bạn có thể lấy được từ phương pháp này là tập lệnh Ant có thể chạy được từ maven và Ant.

Các vấn đề liên quan