Domanda

Ho bisogno di eseguire alcuni comandi formica seconda una variabile di ambiente passata come parametro al comando Maven build.

Al momento ho 3 blocchi compiti e solo le attività blocco con viene eseguita nessuna 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>

Che cosa sto facendo di sbagliato, c'è un modo migliore per fare questo?

È stato utile?

Soluzione

In primo luogo, secondo il sito 1.x Maven, l'attuale versione stabile per Maven 1.x è la versione 1.1, non 1.4. In secondo luogo, non v'è alcuna AntRun Plugin versione 1.7 e, per quanto ne so, questo è un plugin Maven 2. In terzo luogo, la sintassi si utilizza sembra molto simile a mediante attributi , 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 si esplicitamente menzionati Maven 1, cercherò di rispondere. Se ricordo bene, vorrei scrivere un obiettivo personalizzato e utilizzare gelatina di 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 lontana, e io non provarlo (sono troppo pigro per l'installazione Maven 1). Ma penso che si farà. Il riferimento rel="noreferrer"> scripting può aiutare.

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

UPDATE: Sembra che il PO è in realtà utilizzando Maven 2 così io aggiornare la mia domanda di conseguenza. Per implementare il comportamento desiderato, è possibile utilizzare if compito di Ant-contrib 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 Maven" di fare le cose. Ora che ho capito un po 'meglio ciò che si sta cercando di fare (ma non del tutto come non ha spiegato il tuo obiettivo finale), credo che l'utilizzo di costruire profili sarebbe più appropriato e, dopo aver letto la tua risposta proprio, penso che hai più complicare le cose (e che siete sulla strada sbagliata ).

ho capito che sei un principiante Maven, ma io suggerirei di provare a utilizzarlo anche se invece di cadere di nuovo in formica o non sarà possibile ottenere i benefici di esso. Inoltre, quando si apre una domanda, invece di chiedere una soluzione specifica, si dovrebbe piuttosto spiegare il tuo problema generale, si otterrà risposte migliori. Qui, non posso fornire maggiori orientamenti come io non so che cosa si sta realmente cercando di ottenere.

Altri suggerimenti

Non è necessario utilizzare AntContrib dopo maven-antrun-plugin 1.5 che utilizza <target> invece di <tasks> secondo il utilizzo plug . Questo tag funziona allo stesso modo come, ma in questo si può aggiungere condizioni come nell'esempio qui sotto.

<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à. È possibile configurarlo per un genitore e un progetto sottomodulo troppo, definendo il plugin sul tag <pluginsManagement> e chiamando alcune proprietà ai sottomoduli, quindi chiamando il plugin.

risolto questo problema con la creazione di bersagli multipli denominate con "se" attributi e una proprietà condizione in un file build.xml nella root del progetto come segue.

      

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

proprietà delle opzioni della riga di comando che ho richiesto Passato, e ha invitato gli obiettivi formica nel file build.xml dalla sezione attività nella Maven POM nel seguente modo:

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

https://www.surasint.com / run-ant-con-se-da-Maven /

Un'altra soluzione potrebbe essere: mantenere la formica-contrib-1.0b3.jar ad 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/2017/04/09/run-ant-with-if-from-maven/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top