2011-01-18 15 views
15

Il mio progetto maven java utilizza il plugin maven-antrun per eseguire uno script antid di deploy.xml che distribuisce la mia app. Deploy.xml utilizza l'attività <if> e questo sembra causare il problema;Utilizzo di antcontrib <if> task tramite maven-antrun-plugin

[INFO] compiti Esecuzione
[taskdef] Impossibile caricare le definizioni da risorsa net/sf/antcontrib/antlib.xml. Non è stato trovato.

deploy:
[INFO] --------------------------------------- ---------------------------------
[ERRORE] BUILD ERROR
[INFO] ----- -------------------------------------------------- ----------------- [INFO] Si è verificato un Ant BuildException: Si è verificato il seguente errore durante l'esecuzione di questa riga:
E: \ My_Workspace \ xxxxxx \ xxxxxx \ xxxxxxx \ deploy.xml: 24: Problema: impossibile creare un'attività o digitare se
Causa: il nome non è definito.
Azione: controllare l'ortografia.
Azione: verificare che tutte le attività/tipi personalizzati siano stati dichiarati.
Azione: Verificare che tutte le dichiarazioni preimpostate >/<macrodef> abbiano avuto luogo.

Ecco la configurazione del plug-in antrun dal mio pom;

<plugin> 
    <inherited>false</inherited> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-antrun-plugin</artifactId> 
    <executions> 
     <execution> 
      <id>remote-deploy</id> 
      <phase>install</phase> 
      <configuration> 
       <tasks> 
        <taskdef resource="net/sf/antcontrib/antcontrib.properties" classpathref="maven.plugin.classpath"/> 

         <property name="compile_classpath" refid="maven.compile.classpath" /> 
         <property name="runtime_classpath" refid="maven.runtime.classpath" /> 
         <property name="plugin_classpath" refid="maven.plugin.classpath" /> 

         <echo message="compile classpath: ${compile_classpath}"/> 
         <echo message="runtime classpath: ${runtime_classpath}"/> 
         <echo message="plugin classpath: ${plugin_classpath}"/> 

         <ant antfile="${basedir}/deploy.xml"> 
          <target name="deploy" /> 
         </ant> 
       </tasks> 
      </configuration> 
      <goals> 
       <goal>run</goal> 
      </goals> 
     </execution> 
    </executions> 
    <dependencies> 
     <dependency> 
      <groupId>ant-contrib</groupId> 
      <artifactId>ant-contrib</artifactId> 
      <version>1.0b3</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.ant</groupId> 
      <artifactId>ant</artifactId> 
      <version>1.7.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.ant</groupId> 
      <artifactId>ant-jsch</artifactId> 
      <version>1.7.1</version> 
     </dependency> 
    </dependencies> 
</plugin> 

.. ed ecco la sezione pertinente dal mio deploy.xml;

<target name="deploy" if="deploy"> 
    <if> <!-- line 24 --> 
     <and> 

Perché io guardo nel mio Maven repo posso vedere ant-contrib/ant-contrib/1.0b3/ant-contrib-1.0b3.jar e quando guardo dentro il barattolo posso vedere net/sf/antcontrib/antcontrib.properties quindi nessun problema.

Quando controllo i valori di maven.compile.classpath, maven.compile.classpath e maven.compile.classpath non riesco a vedere alcun riferimento a antcontrib, questo potrebbe essere il problema? Perché non compaiono quando antcontrib è definito come una dipendenza?

+0

https://stackoverflow.com/questions/4368243/maven-antrun-with-sequential-ant-contrib-fails-to-run/45958355#45958355 –

risposta

3

OK, l'ho risolto.

Spostare le dipendenze dal tag <build><plugin> e inserirle con le altre dipendenze del progetto sembra aver fatto il trucco.

+1

Come spiegato in un'altra risposta, non è una buona idea includere le dipendenze delle formiche nel classpath di compilazione per eseguire il plugin Maven. –

+0

Stranamente, ho dovuto farlo per scaricarlo. Quindi, spostato di nuovo alle dipendenze del plugin. Spero solo che sia stato un problema IDE. – RockMeetHardplace

24

Penso che non sia una buona idea aggiungere form per compilare classpath per eseguire il plugin di maven.

Io uso Maven 3.0.4 e ha funzionato specificando namespace per i tag ant-contrib, ad esempio:

<configuration> 
    <target> 
    <echo message="The first five letters of the alphabet are:"/> 
    <ac:for list="a,b,c,d,e" param="letter" xmlns:ac="antlib:net.sf.antcontrib"> 
     <sequential> 
     <echo>Letter @{letter}</echo> 
     </sequential> 
    </ac:for> 
    </target> 
</configuration> 

mie dipendenze Maven-antrun-plugin:

<dependencies> 
    <dependency> 
    <groupId>ant-contrib</groupId> 
    <artifactId>ant-contrib</artifactId> 
    <version>1.0b3</version> 
    <exclusions> 
     <exclusion> 
     <groupId>ant</groupId> 
     <artifactId>ant</artifactId> 
     </exclusion> 
    </exclusions> 
    </dependency> 
    <dependency> 
    <groupId>org.apache.ant</groupId> 
    <artifactId>ant-nodeps</artifactId> 
    <version>1.8.1</version> 
    </dependency> 
</dependencies> 
+0

È fantastico, grazie! –

+0

L'unica cosa che ha funzionato per me! – electrotype

+0

mi hai salvato la vita! – cthiebaud

0

Un'altra soluzione sarebbe be: mantieni ant-contrib-1.0b3.vaso per un percorso e quindi definire in questo modo

<property name="runningLocation" location="" /> 
<taskdef resource="net/sf/antcontrib/antcontrib.properties"> 
    <classpath> 
     <pathelement location="${runningLocation}/ant-contrib-1.0b3.jar" /> 
    </classpath> 
</taskdef> 

poi

<target name="doSomething"> 
    <if> 
     <equals arg1="${someProp}" arg2="YES" /> 
     <then> 
      <echo message="It is YES" /> 
     </then> 
     <else> 
      <echo message="It is not YES" /> 
     </else> 
    </if> 
</target> 

ho messo esempio di codice completo qui che si può scaricare https://www.surasint.com/run-ant-with-if-from-maven/

2

ho scoperto che è necessario includere l'Ant- la dipendenza contrib all'interno del plug-in che consentirà il tag taskdef per trovare antcontrib.properties

<plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-antrun-plugin</artifactId> 
      <dependencies> 
       <dependency> 
        <groupId>ant-contrib</groupId> 
        <artifactId>ant-contrib</artifactId> 
        <version>20020829</version> 
       </dependency> 
      </dependencies> 
      <executions> 
       <execution> 
        <id>copy-and-rename-template-files</id> 
        <phase>prepare-package</phase> 
        <goals> 
         <goal>run</goal> 
        </goals> 
        <configuration> 
         <target name = "copy-and-rename-template-files"> 
          <taskdef resource="net/sf/antcontrib/antcontrib.properties"/> 
          <if> 
           <available file="src/main/resources/docker/templates" type="dir"/> 
           <then> 
            <copy todir="${project.build.directory}/docker"> 
             <fileset dir="src/main/resources/docker/templates"> 
              <include name="**/*"/> 
             </fileset> 
            </copy> 


            <move todir="${project.build.directory}/docker"> 
             <fileset dir="${project.build.directory}/docker"> 
              <include name="*"/> 
             </fileset> 
             <mapper> 
              <regexpmapper from="(.*)project(.*)" to="\1${project.artifactId}\2"/> 
             </mapper> 
            </move> 
           </then> 

           <else> 
            <echo>src/main/resources/docker/templates does not exist, skipping processing docker templates</echo> 
           </else> 
          </if> 
         </target> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
+0

Grazie per aver cercato di aiutare StackOverflow, ma la tua risposta sarebbe ancora più apprezzata se avessi aumentato il tuo codice con qualche spiegazione. – Yunnosch

+0

Nessun problema, la mia spiegazione è stata aggiunta. – Gapmeister66

+0

Grazie! Questo era esattamente quello che stavo cercando! – rcantrel

Problemi correlati