2009-12-28 11 views
6

Ho bisogno di eseguire alcuni comandi ant che dipendono da una variabile d'ambiente passata come parametro al comando maven build.Come eseguire le attività in modo condizionale usando il plugin maven-antrun?

Al momento sono presenti 3 blocchi di attività e viene eseguito solo il blocco delle attività senza condizione.

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

Cosa sto facendo male, c'è un modo migliore per farlo?

+0

Can yo Basta confermare come chiami Maven e passare il parametro? –

+0

Lo vedo correttamente, che il secondo compito non ha un nome? –

risposta

9

Innanzitutto, secondo il sito Web di Maven 1.x, l'attuale versione stabile per maven 1.x è la versione 1.1, non 1.4. In secondo luogo, non esiste Plugin AntRun versione 1.7 e, a mia conoscenza, questo è un plugin Maven 2. In terzo luogo, la sintassi si utilizza sembra molto simile a Using Attributes che, ancora una volta, è di circa Maven 2.

Quindi, io possa mancare qualcosa, ma, questo è molto confusa e si dovrebbe forse chiarire questi punti nella sua interrogazione.

In ogni caso, come hai esplicitamente menzionato Maven 1, proverò a rispondere. Se ricordo bene, vorrei scrivere un obiettivo personalizzato e utilizzare Jelly's core:if o core:when. Per fare ciò, fornire qualcosa di simile in 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> 

Io non sono davvero sicuro della sintassi, tutta questa roba Maven 1 è troppo lontano, e non ho la prova che (io sono troppo pigro per installare Maven 1). Ma immagino che lo farai. Il scripting reference potrebbe aiutarti.

Per essere onesti, io davvero spero che tu abbia un buon motivo per preferire Maven 1.x su Maven 2.x :)

UPDATE: Sembra che l'OP è in realtà utilizzando Maven 2 così ho aggiornerò la mia domanda di conseguenza. Per implementare il comportamento desiderato, è possibile utilizzare il compito di Ant-contrib if come illustrato di seguito:

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

e quindi chiamare mvn compile -Dfoo=bar (questo è solo un esempio).

Ma tutto questo non è il "modo esperto" di fare le cose. Ora che capisco un po 'meglio quello che stai cercando di fare (ma non del tutto perché non hai spiegato il tuo obiettivo finale), penso che usare build profiles sarebbe più appropriato e, dopo aver letto la tua risposta, penso che tu sia a complicare le cose (e che sei sulla strada sbagliata).

Capisco che tu sia un principiante di Maven ma ti suggerirei di provare ad usarlo anche se invece di ricadere su Ant o non ne otterrai i benefici. Inoltre, quando apri una domanda, invece di chiedere una soluzione specifica, dovresti piuttosto spiegare il tuo problema generale, otterrai risposte migliori. Qui, non posso fornire ulteriori indicazioni in quanto non so cosa stai cercando di ottenere.

+0

Mi scuso, abbastanza nuovo per Maven. Sto usando Maven 2.0.9 con JDK 1.4. – vaughan

+0

Nessun problema, questo ha più senso. Aggiornerò la mia risposta di conseguenza. –

+0

Grazie per il tuo aiuto Pascal. La tua soluzione sopra sembra esattamente quello che stavo cercando di ottenere. Non sono riuscito a ottenere le dichiarazioni "if" che funzionavano prima, poiché non ero a conoscenza del fatto che dovevo includere una risorsa ant-contrib. In sostanza ciò che sto cercando di ottenere è la creazione di una struttura di directory su un server di app che varia a seconda che io stia eseguendo la distribuzione in un ambiente di sviluppo/test o in un ambiente di produzione. Ho appena dato un'occhiata ai profili di build e sembra che questo sarebbe un modo migliore di fare le cose. Grazie! – vaughan

0

Risolto questo problema creando più destinazioni nominate con attributi "se" e una proprietà di condizione in un file build.xml nella radice del progetto come segue.

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

proprietà passate degli interruttori della riga di comando che ho richiesto, e ha invitato gli obiettivi formica nel file build.xml dalla sezione attività nel Maven POM come segue:

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

Senza offesa, ma questo è un modo orribile di usare Maven per risolvere il tuo problema. –

+0

perché hai bisogno di chiamare un bersaglio specifico e di controllare se hai chiamato il bersaglio giusto? Non puoi semplicemente chiamare il bersaglio giusto da parte di Maven a seconda dell'ambiente (ad esempio chiamato in base ai nomi dell'ambiente)? –

4

Non è necessario utilizzare AntContrib dopo maven-antrun-plugin 1.5 che utilizza <target> invece di <tasks> secondo le plugin usage. Questo tag funziona allo stesso modo di, ma in questo è possibile aggiungere condizioni come nell'esempio seguente.

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

Il codice sopra sempre esegue il primo obiettivo, ma il secondo bersaglio dipende da un valore di proprietà. Puoi configurarlo anche per un genitore e un sottomodulo, definendo il plugin sul tag <pluginsManagement> e chiamando alcune proprietà ai sotto-moduli, quindi chiamando il plugin.

+1

Grazie. funziona –

+0

Grazie! "my-target" viene eseguito solo se "execute.my.target" è definito ed equivale a "true", "on" o "yes". – Sxilderik

+0

Non funziona in 1.8. Se metto due 'target' in' 'il plugin esegue solo l'ultimo (e Intellij IDEA segna l'ultimo target con errore su pom.xml). – Dherik

0

esempio runable qui https://www.surasint.com/run-ant-with-if-from-maven/

Un'altra soluzione potrebbe essere: mantenere la formica-contrib-1.0b3.jar un percorso e indicare come questo

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

Inserisco qui un esempio di codice completo che è possibile scaricare https://www.surasint.com/2017/04/09/run-ant-with-if-from-maven/

Problemi correlati