2010-10-14 19 views
6

Sto tentando di caricare un file utilizzando un'attività Ant. Se uso Ant direttamente il file viene caricato, ma se chiamo il compito formica via Maven (utilizzando il maven-antrun-plugin) ottengo il seguente errore:Carica file tramite attività FTP Ant in Maven

una formica BuildException è verificato: Si è verificato il seguente errore durante l'esecuzione di questa linea:

/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 

formica-commonsnet.jar è chiaramente disponibile per Ant:

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

è il percorso di classe Ant definito separatamente per Maven-antrun-plug, o mi sto perdendo qualcosa?

risposta

4

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

Sì, ma Maven e il maven-antrun-plugin non utilizza il tuo Ant locale di installazione.

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

Il modo di utilizzare le attività Ant non inclusi nel vaso di default di Ant è documentato in Using tasks not included in Ant's default jar (che dovrebbe sicuramente aiutare):

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

Questo è l'approccio giusto. Le uniche cose che suggerirei di fare in modo diverso sono: 1) specificare il gruppo 'ant' id invece di 'org.apache.ant' dato che questo è quello che i plugin Maven fanno riferimento internamente. –

+1

Se si tratta di un progetto a più moduli, si dovrebbe anche considerare di aggiungere le dipendenze a una sezione pluginManagement all'interno del pom del progetto root. Ciò impedirà ad altri riferimenti a antrun nel tuo progetto di aggirare le tue dipendenze. –

+0

@Tim Infatti, [dalla versione 1.7.0] (http://mvnrepository.com/artifact/org.apache.ant/ant-commons-net) di 'ant-commons-net',' groupId' è 'org.apache.ant' ma quello sopra è corretto per la versione 1.6.5. In altre parole, adattalo se vuoi usare una versione più recente. E tu naturalmente hai ragione riguardo alla sezione 'pluginManagement'.Aggiornerò la mia risposta per dire che ... domani :) Grazie per entrambi i commenti! –

0

C'è una proprietà classpath che può essere impostata nella sezione <tasks> di maven-antrun-plugin.

Per esempio,

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

Come ha detto Pascal, il Maven-antrun-plugin non sta usando la formica specificata dalla tua variabile d'ambiente $ ANT_HOME e la configurazione che ha menzionato è probabilmente il modo migliore per farlo in modo coerente da una prospettiva puramente meccanica.

Tuttavia, il vaso può essere memorizzato in $ USER_HOME/.ant/lib anziché $ ANT_HOME/lib, questi vasi devono essere disponibili sul classpath per qualsiasi istanza di formica che è gestito da quell'utente.

Nota che lo script ant non può assumere che i vasi sono presenti, e che i vasi sono immessi sul classpath in fase di avvio, quindi se lo script definisce un obiettivo di installazione per scaricare i vasi in $ USER_HOME/.ant/lib, quindi questo target dovrebbe essere eseguito in una "separate-ant-session", prima e viene richiamato di nuovo per eseguire l'attività che dipende dal jar.

L'unico potenziale vantaggio derivante da questo approccio è che lo script Ant può essere eseguibile da Maven e Ant.