2011-01-18 15 views
15

Mój program maven java używa wtyczki maven-antrun do wykonania skryptu ant deploy.xml, który wdraża moją aplikację. Plik deploy.xml używa zadania <if> i wydaje się, że to powoduje problem;Korzystanie z zadania antcontrib <if> za pomocą wtyczki maven-antrun

[info] Wykonywanie zadań
[taskdef] Nie można wczytać definicje z zasobów netto/sf/antcontrib/antlib.xml. Nie można go znaleźć.

wdrożenie:
[INFO] --------------------------------------- ---------------------------------
[BŁĄD] BUILD ERROR
[INFO] ----- -------------------------------------------------- -----------------
[INFO] Wystąpił wyjątek Ant BuildException: Wystąpił następujący błąd podczas wykonywania tej linii:
E: \ My_Workspace \ xxxxxx \ xxxxxx \ xxxxxxx \ deploy.xml: 24: Problem: nie udało się utworzyć zadania lub wpisać, jeśli:
Przyczyna: Nazwa jest niezdefiniowana.
Czynność: sprawdź pisownię.
Czynność: Sprawdź, czy zadeklarowano niestandardowe zadania/typy.
Czynność: Sprawdź, czy zostały dokonane jakiekolwiek deklaracje </<macrodef>.

Oto konfiguracja wtyczki antrun z mojej 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> 

.. i tutaj znajduje się odpowiednia sekcja z mojego pliku deploy.xml;

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

Dlaczego patrzę w moim repo maven widzę ant-contrib/ant-contrib/1.0b3/ant-contrib-1.0b3.jar i kiedy patrzę wewnątrz słoika widzę net/sf/antcontrib/antcontrib.properties więc nie ma problemu.

Kiedy sprawdzenia wartości maven.compile.classpath, maven.compile.classpath i maven.compile.classpath Nie widzę żadnego odniesienia do antcontrib, to może być problem? Dlaczego nie pojawiają się, gdy antcontrib jest zdefiniowany jako zależność?

+0

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

Odpowiedz

3

OK, rozwiązałem to.

Przeniesienie zależności z tagu <build><plugin> i umieszczenie ich w innych zależnościach projektu sprawdziło się.

+1

Jak wyjaśniono w innej odpowiedzi, nie jest dobrym pomysłem uwzględnienie zależności ant. w kompilacji ścieżki klas w celu uruchomienia wtyczki Maven. –

+0

O dziwo, musiałem to zrobić, aby pobrać. Następnie przeniesiono go z powrotem do zależności wtyczek. Mam tylko nadzieję, że to problem z IDE. – RockMeetHardplace

24

Myślę, że nie jest dobrym pomysłem dodawanie mrówki do kompilacji ścieżki klasowej w celu uruchomienia dodatku maven.

Używam Maven 3.0.4 i pracował przez podanie nazw dla tagów ant-contrib, na przykład:

<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> 

Moje zależnościami 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

To niesamowite, dzięki! –

+0

Jedyna rzecz, która zadziałała dla mnie! – electrotype

+0

uratowałeś mi życie! – cthiebaud

0

Innym rozwiązaniem be: zachowaj ant-contrib-1.0b3.jar do ścieżki, a następnie zdefiniować go jak ten

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

następnie

<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> 

kładę tutaj pełny przykład kodu, który można pobrać https://www.surasint.com/run-ant-with-if-from-maven/

2

stwierdziliśmy, że trzeba obejmować ant- zależność contrib w wtyczce, która umożliwi tagowi taskdef znalezienie 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

Dzięki za pomoc w StackOverflow, ale twoja odpowiedź byłaby jeszcze bardziej doceniona, gdybyś uzupełnił swój kod z jakimś wyjaśnieniem. – Yunnosch

+0

Nie ma problemu, moje wyjaśnienie zostało dodane. – Gapmeister66

+0

Dzięki! Właśnie tego szukałem! – rcantrel