2009-12-28 11 views
6

Necesito ejecutar algunos comandos ant dependiendo de una variable de entorno pasada como un parámetro al comando de construcción maven.¿Cómo ejecutar tareas de manera condicional usando maven-antrun-plugin?

Por el momento tengo 3 bloques de tareas y solo se está ejecutando el bloque de tareas sin ninguna condición.

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

¿Qué estoy haciendo mal, hay una mejor manera de hacerlo?

+0

Can yo ¿Simplemente confirmas cómo llamas a maven y pasas el parámetro? –

+0

¿Lo veo correctamente, que su segunda tarea no tiene nombre? –

Respuesta

9

En primer lugar, según el sitio web de Maven 1.x, la versión estable actual para maven 1.x es la versión 1.1, no 1.4. En segundo lugar, no existe AntRun Plugin versión 1.7 y, que yo sepa, este es un plugin de Maven 2. En tercer lugar, la sintaxis que está utilizando parece muy similar a Using Attributes que, una vez más, es sobre Maven 2.

Por lo tanto, me puede faltar algo pero, esto es muy confuso y tal vez debería aclarar estos puntos en su pregunta.

De todos modos, como mencionó explícitamente Maven 1, intentaré responder. Si recuerdo bien, escribiría un objetivo personalizado y usaría el core:if de Jelly o el core:when. Para ello, ofrecer algo como esto en 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> 

Realmente no estoy seguro de la sintaxis, todo esto Maven 1 cosas es demasiado lejos, y no he probado (yo soy demasiado perezoso para instalar Maven 1). Pero supongo que lo harás. El scripting reference puede ayudarlo.

Para ser honesto, realmente esperamos que tenga una buena razón para preferir Maven 1.x 2.x sobre Maven :)

ACTUALIZACIÓN: Parece que el PO en realidad está utilizando Maven 2, de modo que Actualizaré mi pregunta en consecuencia. Para implementar el comportamiento deseado, se puede usar la tarea de Ant-contrib if como se muestra a continuación:

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

y luego llamar mvn compile -Dfoo=bar (esto es sólo un ejemplo).

Pero, todo esto no es la "manera maven" de hacer las cosas. Ahora que entiendo un poco mejor lo que está tratando de hacer (pero no del todo porque no explicó su objetivo final), creo que usar build profiles sería más apropiado y, habiendo leído su propia respuesta, creo que está sobre cosas complicadas (y que estás en el camino equivocado).

Entiendo que eres un principiante de Maven, pero te sugiero que intentes usarlo en lugar de recurrir a Ant o no obtendrás los beneficios. Además, al abrir una pregunta, en lugar de solicitar una solución específica, debería explicar su problema general, obtendrá mejores respuestas. Aquí, no puedo proporcionar más orientación ya que no sé lo que realmente estás tratando de lograr.

+0

Disculpas, algo nuevo para Maven. Estoy usando Maven 2.0.9 con JDK 1.4. – vaughan

+0

No hay problema, esto tiene más sentido. Actualizaré mi respuesta en consecuencia. –

+0

Gracias por su ayuda Pascal. Su solución anterior parece exactamente lo que estaba tratando de lograr. No pude hacer funcionar las declaraciones 'si' antes, ya que no sabía que debía incluir un recurso ant-contrib. Esencialmente, lo que intento lograr es crear una estructura de directorios en un servidor de aplicaciones que difiera dependiendo de si estoy implementando un entorno de desarrollo/prueba o un entorno de producción. Acabo de echar un vistazo rápido a los perfiles de construcción y parece que esta sería una manera mucho mejor de hacer las cosas. ¡Gracias! – vaughan

0

Resolvió este problema creando varios objetivos con nombre con atributos "if" y una propiedad de condición en un archivo build.xml en la raíz del proyecto de la siguiente manera.

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

propiedades pasadas de los modificadores de línea de comandos que se requiere, y llamó a los objetivos de hormigas en el archivo build.xml de la sección de tareas en el Maven POM de la siguiente manera:

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

Sin ofender, pero esta es una forma horrible de usar maven para resolver su problema. –

+0

¿por qué necesita llamar a un objetivo específico y luego verificar si llamó al objetivo correcto? ¿No puedes simplemente llamar al objetivo correcto de maven dependiendo del entorno (por ejemplo, tareas asignadas según los nombres del entorno)? –

4

No es necesario utilizar AntContrib después maven-antrun-plugin 1.5 que utiliza <target> en lugar de <tasks> acuerdo con plugin usage. Esta etiqueta funciona de la misma manera que, pero en esta puede agregar condiciones como en el siguiente ejemplo.

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

El código anterior siempre ejecuta el primer objetivo, pero el segundo objetivo depende del valor de la propiedad. También puede configurarlo para un proyecto principal y un submódulo, definiendo el complemento en la etiqueta <pluginsManagement> y llamando a algunas propiedades en los submódulos, y luego llamando al complemento.

+1

Gracias. funciona –

+0

¡Gracias! "my-target" se ejecuta solo si se define "execute.my.target" e iguala a "true", "on", o "yes". – Sxilderik

+0

No funciona en 1.8. Si pongo dos 'target' en' ', el plugin solo ejecuta el último (e Intellij IDEA marca el último objetivo con error en pom.xml). – Dherik

0

ejemplo runable aquí https://www.surasint.com/run-ant-with-if-from-maven/

Otra solución sería: mantener la hormiga-contrib-1.0b3.jar a un camino y luego lo definen como esto

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

continuación

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

Puse ejemplo de código completo aquí que puede descargar https://www.surasint.com/2017/04/09/run-ant-with-if-from-maven/

Cuestiones relacionadas