2009-10-01 20 views
20

Escenario:Maven - activar el perfil del niño basada en la propiedad

  1. Dada
      POM
    1. Padres que define un perfil y un niño (como módulo)
    2. proyecto (s) del niño que va a utilizar el perfil al referirse al padre POM.
  2. La intención es que se omite la ejecución de perfil en la matriz y ejecutarlo en el niño sólo
  3. perfil tiene una sección de activación <activation><property><name>foo</name></property><activation>
  4. Dado que los padres no define foo propiedad - el perfil está inactivo y no será ejecutado para la compilación primaria
  5. Ahora, estoy definiendo <properties><foo>true</foo></properties> en el niño con la esperanza de que la propiedad se recoja cuando se ejecute la compilación infantil y se active el perfil. No tal suerte. El perfil nunca se activa, lo que me dice que la propiedad nunca se establece.
  6. para notar: mvn package -Dfoo=true activa el perfil de padres e hijos

estoy tratando de hacer lo imposible o simplemente haciendo mal?

P.S. Hmmm: incluso si defino propiedad en el elemento primario, el perfil no se activa. ¿Lo que da?

Respuesta

7

Para expandir la respuesta de @ rich-seller, y la auto-respuesta de @Bostone, parece imposible tener una configuración donde el POM padre define algunos perfiles como alternativas, y los POM secundarios seleccionan uno de estos perfiles de forma predeterminada, mientras que le permiten anular la elección de un niño temporalmente (es decir, en la CLI).Considere un POM padres para proyectos que utilizan algún tipo de marco y un plug-in asociado, cuyos dos versiones podemos suponer se definen por propiedades:

<profiles> 
    <profile> 
    <id>newest</id> 
    <activation> 
     <activeByDefault>true</activeByDefault> 
    </activation> 
    <properties> 
     <framework.version>2.0</framework.version> 
     <plugin.version>2.0</plugin.version> 
    </properties> 
    </profile> 
    <profile> 
    <id>older</id> 
    <activation> 
     <property> 
     <name>older.framework</name> 
     <value>true</value> 
     </property> 
    </activation> 
    <properties> 
     <framework.version>1.1</framework.version> 
     <plugin.version>1.1</plugin.version> 
    </properties> 
    </profile> 
</profiles> 

Ahora un niño que hereda de este POM matriz por defecto utilizará 2.0 como lo haría espera, y -Polder o -Dolder.framework=true trabajará para intentar construirlo con el marco anterior (por ejemplo, para probar la compatibilidad). Sin embargo no se puede escribir en el niño POM

<properties> 
    <older.framework>true</older.framework> 
</properties> 

y tienen el perfil older se activará automáticamente. Puede utilizar la activación basada en archivos para hacer que este módulo compile contra 1.1 si newest no estaban activos por defecto, pero luego no es fácil ejecutarlo temporalmente contra 2.0: por lo que sé, los perfiles older y newest estarían activos si pasó -Pnewest, por lo que necesita explícitamente desactivar otros perfiles que no es razonable si tiene una docena de ellos. Así que simplemente no hay ninguna solución excepto para copiar la información de perfil a la POM niño:

<properties> 
    <framework.version>1.1</framework.version> 
    <plugin.version>1.1</plugin.version> 
</properties> 

momento en el que se -Pnewest no trabajo para anular estas propiedades, por lo que es necesario utilizar -Dframework.version=2.0 -Dplugin.version=2.0.

En otras palabras, los perfiles solo son útiles si todos los módulos secundarios pueden usar el mismo perfil (aquí newest) de manera predeterminada. Si algunos de ellos se construyen normalmente con 1.1 y algunos con 2.0, los perfiles son inútiles.

Parece que esto es un caso de uso para una mejora de núcleo Maven, o tal vez una extensión de construcción Maven 3. http://docs.codehaus.org/display/MAVEN/Custom+Profile+Activators y https://github.com/maoo/maven-tiles vienen a la mente.

+0

Sí. Estoy aceptando esto ya que se basa en mi respuesta y generalmente no me gusta aceptar mi propia – Bostone

+0

Información muy útil. Y gracias por el consejo sobre la activación basada en archivos; eso resolvió mi problema muy limpiamente. – Allan

5

El perfil solo puede ser activado por propiedades pasadas desde la línea de comando. Esto se debe a que las propiedades en el POM solo se pueden procesar una vez que se haya analizado el POM, momento en el que es demasiado tarde para resolver la activación del perfil.

Tiene un poco de catch-22 con este enfoque a menos que pueda pasar la propiedad desde la línea de comando, especifique la activación de perfil en su settings.xml (generalmente no es una gran idea), o use el solución en mi previous answer para usar la presencia de un archivo de marcador.

Una última alternativa si está en Maven 2.1.0+ es desactivar el perfil a través de la línea de comandos para el POM principal, esto obviamente no es ideal.

Puede desactivar un perfil con el carácter '!' o '-' como esto:

mvn install -P !profile-1,!profile-2 
+0

Tenía tanto miedo. En realidad, parece que la ejecución del perfil está configurada y no puede modificarse una vez iniciada la compilación (incluso con el archivo marcador). Con la desactivación, ¿a qué se refieren estos -1 y -2? Si tengo padre e hijo y el perfil "compilar", ¿supondrá lo siguiente cancelar el perfil en el padre? (En mis pruebas no es) 'mvn install -P! Buiild-1' – Bostone

+0

No lo entiendo exactamente. ¿Por qué los activadores de perfil '' o '' no funcionan? –

+0

el ejemplo es para desactivar dos perfiles llamados 'profile-1' y' profile-2', no hay un significado especial para '-1' o' -2'. En su caso, simplemente sería 'mvn install -P! Build' –

5

Para responder directamente a mi propia pregunta: en la construcción de varios módulos todas las propiedades se establecen antes de construcción se ejecuta por lo que es imposible para activar/desactivar el perfil de uno de los módulos durante la compilación basada en la configuración de la propiedad en el POM hijo. Sin embargo, si está buscando la forma de hacerlo usando otros medios, por favor read this comment

Cuestiones relacionadas