2010-10-14 14 views
6

Próbuję przesłać plik przy użyciu zadania Ant. Jeśli używam Ant bezpośrednio plik zostanie przesłany, ale jeśli ja nazywam ant zadania poprzez Maven (używając maven-antrun-plugin) pojawia się następujący błąd:Prześlij plik za pomocą zadania FTP Ant w Maven

mrówkę BuildException nie wystąpił: Wystąpił następujący błąd podczas wykonywania tej linii:

/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 jest oczywiście dostępny do Ant:

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

Czy Ant ścieżka klasy zdefiniowane oddzielnie dla maven-antrun-plugin, albo ja czegoś brakuje?

Odpowiedz

4

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

Tak, ale Maven i maven-antrun-plugin nie korzysta się z lokalnym Ant zainstalować.

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

Sposób korzystania Ant zadania nie ujęte w Ant domyślnej słoiku jest udokumentowana w Using tasks not included in Ant's default jar (co zdecydowanie powinno pomóc):

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

To jest właściwe podejście. Jedyne rzeczy, które proponuję robić inaczej to: 1) określenie 'ant' groupId zamiast' org.apache.ant', ponieważ to jest to, co wewnętrzne wtyczki Maven'a odwołują. –

+1

Jeśli jest to projekt wielomodułowy, powinieneś rozważyć dodanie zależności do sekcji pluginManagement w głównym projekcie pom. Uniemożliwi to innym odniesieniom do programu antirun w twoim projekcie, odzwyczajając twoje zależności. –

+0

@Tim Rzeczywiście, [od wersji 1.7.0] (http://mvnrepository.com/artifact/org.apache.ant/ant-commons-net) 'ant-commons-net',' groupId' to 'org.apache.ant', ale powyższy kod jest poprawny dla wersji 1.6.5. Innymi słowy, dostosuj go, jeśli chcesz użyć nowszej wersji. I masz rację co do sekcji 'pluginManagement'.Zaktualizuję moją odpowiedź, aby wspomnieć o tym ... jutro :) Dzięki za oba komentarze! –

0

Istnieje właściwość classpath, którą można ustawić w sekcji <tasks> z maven-antrun-plugin.

Na przykład

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

Pascal nie wspomniano, Maven-antrun-plugin nie używa mrówki określonej przez twoją zmienną środowiskową $ ANT_HOME, a konfiguracja, o której wspomniał, jest prawdopodobnie najlepszym sposobem zrobienia tego konsekwentnie z perspektywy czystej maven.

Jednak słoik może być przechowywany w $ USER_HOME/.ant/lib zamiast $ ANT_HOME/lib te słoiki powinny być dostępne na ścieżce klasy dla każdej instancji mrówce, który jest uruchamiany przez tego użytkownika.

Uwaga że mrówka skrypt nie można zakładać, że słoiki są obecne i że słoiki są umieszczane tylko na ścieżce klasy przy starcie, więc jeśli skrypt definiuje cel instalacyjny do pobrania słoiki do $ USER_HOME/.ant/lib, wtedy ten obiekt docelowy musiałby być uruchamiany w "oddzielnej sesji" przed i jest wywoływany ponownie, aby wykonać zadanie zależne od słoika.

Jedyną potencjalną korzyścią, jaką możesz uzyskać z tego podejścia, jest to, że skrypt Ant może być uruchamiany z maven i Anta.

Powiązane problemy