2009-12-28 12 views
6

Potrzebuję wykonać niektóre komendy mrówki w zależności od zmiennej środowiskowej przekazanej jako parametr do polecenia budowania maven.Jak wykonywać zadania warunkowo za pomocą wtyczki maven-antrun?

W tej chwili mam 3 bloki zadań i tylko blok zadań bez warunku jest wykonywany.

<tasks name="isProdCheck"> 
    <condition property="isProd"> 
    <equals arg1="${environment}" arg2="PROD" /> 
    </condition> 
</tasks> 

<tasks if="isProd" depends="isProdCheck"> 
... 
</tasks> 

<tasks> 
... I am the only block executed 
</tasks> 

Co robię źle, czy istnieje lepszy sposób na zrobienie tego?

+0

Czy możesz po prostu potwierdzasz jak nazywasz maven i przekazujesz parametr? –

+0

Czy widzę poprawnie, że drugie zadanie nie ma nazwy? –

Odpowiedz

9

Po pierwsze, zgodnie ze stroną Maven 1.x, obecna stabilna wersja dla maven 1.x to wersja 1.1, a nie 1.4. Po drugie, nie ma wersji AntRun Plugin 1.7 i, o ile mi wiadomo, jest to wtyczka Maven 2. Po trzecie, składnia, której używasz, wydaje się bardzo podobna do Using Attributes, która znowu dotyczy Mavena 2.

Może brakuje mi czegoś, ale jest to bardzo mylące i powinieneś wyjaśnić te kwestie w swoim pytaniu.

W każdym razie, jak wyraźnie wspomniano o Mavenie 1, spróbuję odpowiedzieć. Jeśli dobrze pamiętam, napisałbym niestandardowy cel i użyłbym Jelly's core:if lub core:when. Aby to zrobić, zapewnić coś takiego w maven.xml:

<project xmlns:j="jelly:core" xmlns:ant="jelly:ant"> 
    <goal name="my-goal"> 
    <j:if test="${environment == 'PROD'}"> 
     <ant:xxx .../> 
    </j:if> 
    </goal> 
</project> 

ja naprawdę nie jestem pewien składni, to wszystko Maven 1 rzeczy jest po prostu zbyt daleko, a ja nie przetestować go (jestem zbyt leniwy, aby zainstalować Mavena 1). Ale myślę, że tak. Pomocne może być scripting reference.

Szczerze mówiąc, mam nadzieję, że masz dobry powód, aby preferować Maven 1.x ponad Maven 2.x :)

UPDATE: Wydaje się, że PO jest rzeczywiście przy Maven 2, tak ja "Odpowiednio zaktualizuję moje pytanie. W celu realizacji pożądanego zachowania, można użyć Ant-contrib za if zadanie, jak pokazano poniżej:

<build> 
    <plugins> 
     <plugin> 
     <artifactId>maven-antrun-plugin</artifactId> 
     <version>1.3</version> 
     <executions> 
      <execution> 
      <phase>compile</phase> 
      <goals> 
       <goal>run</goal> 
      </goals> 
      <configuration> 
       <tasks> 
       <taskdef resource="net/sf/antcontrib/antcontrib.properties" 
        classpathref="maven.plugin.classpath" /> 
       <if> 
        <equals arg1="${foo}" arg2="bar" /> 
        <then> 
        <echo message="The value of property foo is bar" /> 
        </then> 
        <else> 
        <echo message="The value of property foo is not bar" /> 
        </else> 
       </if> 
       </tasks> 
      </configuration> 
      </execution> 
     </executions> 
     <dependencies> 
      <dependency> 
      <groupId>ant-contrib</groupId> 
      <artifactId>ant-contrib</artifactId> 
      <version>20020829</version> 
      </dependency> 
     </dependencies> 
     </plugin> 
    </plugins> 
    </build> 

a następnie zadzwonić mvn compile -Dfoo=bar (to tylko przykład).

Ale to wszystko nie jest "maven way" do robienia rzeczy. Teraz, gdy rozumiem nieco lepiej, co próbujesz zrobić (ale nie do końca tak, jak nie wyjaśniłeś swojego ostatecznego celu), myślę, że bardziej odpowiednie byłoby użycie build profiles i po przeczytaniu twojej własnej odpowiedzi, myślę, że jesteś przez komplikowanie rzeczy (i to, że jesteś na złej drodze).

Rozumiem, że jesteś początkującym Mavenem, ale sugeruję spróbować go użyć, zamiast polegać na Mrówce, inaczej nie uzyskasz korzyści z tego. Ponadto, otwierając pytanie, zamiast pytać o konkretne rozwiązanie, powinieneś raczej wyjaśnić swój ogólny problem, otrzymasz lepsze odpowiedzi. Tutaj nie mogę podać więcej wskazówek, ponieważ nie wiem, co naprawdę chcesz osiągnąć.

+0

Przeprosiny, całkiem nowe dla Mavena. Używam Maven 2.0.9 z JDK 1.4. – vaughan

+0

Nie ma problemu, to ma więcej sensu. Odpowiednio zaktualizuję swoją odpowiedź. –

+0

Dzięki za pomoc Pascal. Twoje rozwiązanie powyżej wygląda dokładnie tak, jak próbowałem osiągnąć. Nie mogłem uzyskać wcześniejszych instrukcji "jesli", ponieważ nie wiedziałem, że muszę dołączyć do zasobu ant-contrib. Zasadniczo staram się osiągnąć strukturę katalogów na serwerze aplikacji, która różni się w zależności od tego, czy wdrażam środowisko programistyczne/testowe czy środowisko produkcyjne. Właśnie obejrzałem profile kompilacji i brzmi to jak lepszy sposób robienia rzeczy. Dzięki! – vaughan

0

Rozwiązano ten problem, tworząc wiele nazwanych celów za pomocą atrybutów "if" i właściwości warunku w pliku build.xml w katalogu głównym projektu w następujący sposób.

<target name="prod" if="isProd" depends="isProdCheck"> 
    // do something 
</target> 

Passed właściwości przełączników wiersza polecenia I wymagane, a zwanych mrówka cele w pliku build.xml z sekcji Zadania w Maven POM w następujący sposób:

<tasks> 
<ant antfile="${basedir}/build.xml"> 
    <property name="environment" value="${environment}"/>   
    <target name="prod"/> 
</ant>   
</tasks> 
+0

Bez urazy, ale jest to okropny sposób użycia maven do rozwiązania problemu. –

+0

dlaczego musisz zadzwonić do określonego celu, a nie sprawdzić, czy zadzwoniłeś do właściwego celu? Nie możesz po prostu wywołać właściwego celu z maven w zależności od środowiska (np. Zadania o nazwie zgodnie z nazwami środowiskowymi)? –

4

Nie trzeba używać AntContrib po maven-antrun-plugin 1.5 który wykorzystuje <target> zamiast <tasks> według plugin usage. Ten tag działa w ten sam sposób, ale w tym można dodać warunki, takie jak poniższy przykład.

<properties> 
    <execute.my.target>true</execute.my.target> 
</properties> 

<build> 
    ... 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-antrun-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>config</id> 
        <phase>package</phase> 
        <goals> 
         <goal>run</goal> 
        </goals> 
        <configuration> 
         <!-- this target will be executed always --> 
         <target> 
          <echo message="Hello there, I'm a simple target" /> 
         </target> 

         <!-- 
          This target will be executed if and only if 
          the property is set to true 
         --> 
         <target name="my-target" if="${execute.my.target}"> 
          <echo message="Conditional target..." /> 
         </target> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
    ... 
</build> 

Powyższy kod zawsze wykonuje pierwszy cel, ale drugi cel zależy od wartości właściwości. Można go skonfigurować również dla projektu nadrzędnego i podmodułu, definiując wtyczkę na znaczniku <pluginsManagement> i wywołując niektóre właściwości w podmodułach, a następnie wywołując wtyczkę.

+1

Dzięki. działa –

+0

Dzięki! "mój cel" jest wykonywany tylko wtedy, gdy zdefiniowano "execute.my.target" i jest równy "true", "on" lub "yes". – Sxilderik

+0

Nie działa w wersji 1.8. Jeśli umieściłem dwa 'target' w' 'wtyczka wykonuje tylko ostatnią (a Intellij IDEA zaznacza ostatni cel z błędem na pom.xml). – Dherik

0

runable przykładem https://www.surasint.com/run-ant-with-if-from-maven/

Innym rozwiązaniem byłoby: utrzymania 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> 

Zamieszczam tutaj przykład pełnego kodu, który można pobrać https://www.surasint.com/2017/04/09/run-ant-with-if-from-maven/

Powiązane problemy