¿Es posible anular la configuración de un complemento ya definido para un perfil en un POM principal?

110

En un archivo principal POM de mi proyecto, tengo un perfil que define algunas configuraciones útiles para este proyecto (para que no pueda deshacerme de este POM principal):

<profile>
<id>wls7</id>
...
<build>
  <plugins>
    <!-- use java 1.4 -->
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <configuration>
        <fork>true</fork>
        <source>1.4</source>
        <target>1.4</target>
        <meminitial>128m</meminitial>
        <maxmem>1024m</maxmem>
        <executable>%${jdk14.executable}</executable>
      </configuration>
    </plugin>
  </plugins>
</build>

...
</profile>

Pero en mi proyecto solo me gustaría anular la configuración de maven-compiler-plugin para usar jdk5 en lugar de jdk4 para compilar clases de prueba.

Por eso hice esta sección en el POM de mi proyecto:

<profiles>
  <profile>
    <id>wls7</id>
        <activation>
            <property>
                <name>jdk</name>
                <value>4</value>
            </property>
        </activation>
    <build>
      <directory>target-1.4</directory>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <executions>
            <execution>
              <id>my-testCompile</id>
              <phase>test-compile</phase>
              <goals>
                <goal>testCompile</goal>
              </goals>
              <configuration>
                <fork>true</fork>
                <executable>${jdk15.executable}</executable>
                <compilerVersion>1.5</compilerVersion>
                <source>1.5</source>
                <target>1.5</target>
                <verbose>true</verbose>
              </configuration>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </build>
  </profile>
              ...
</profiles>

y no funciona ...

Incluso intenté anular la configuración en las secciones de complementos regulares de mi POM (quiero decir, no para un perfil específico sino para todo mi POM).

Cual podría ser el problema ?

Para aclarar algunos de mis requisitos:

  • No quiero deshacerme del POM padre y el perfil (wls7) definido dentro de él (ya que necesito muchas y muchas propiedades, configuraciones, ...) y ese no es el proceso en mi empresa.
  • Una solución basada en duplicar el POM padre y / o el perfil definido en su interior no es buena. Ya que si el responsable del
    POM padre cambiara algo,
    tendría que reportarlo en el mío.

Es solo una cuestión de herencia (extender o anular un perfil, una configuración de un POM de nivel superior), así que creo que debería ser posible con Maven 2.

Guillaume Cernier
fuente
¿Cómo se activa el perfil wls7?
Pascal Thivent
Los perfiles wls7 y wls10 son ambos "activeByDefault" en el POM principal. Pero según las necesidades del cliente, solo el wls10 o ambos se construyen mediante scripts (con el parámetro "-P")
Guillaume Cernier

Respuestas:

145

Se pueden anular las configuraciones de un pom principal agregando el combine.self="override"atributo al elemento en su pom.

Intente cambiar la configuración de su complemento a:

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <executions>
        <execution>
          <id>my-testCompile</id>
          <phase>test-compile</phase>
          <goals>
            <goal>testCompile</goal>
          </goals>
          <configuration combine.self="override">
            <fork>true</fork>
            <executable>${jdk15.executable}</executable>
            <compilerVersion>1.5</compilerVersion>
            <source>1.5</source>
            <target>1.5</target>
            <verbose>true</verbose>
          </configuration>
        </execution>
      </executions>
    </plugin>

Para obtener más información sobre la sustitución de complementos, consulte: http://maven.apache.org/pom.html

Rolf
fuente
Parece que para Maven2.2.1, si hace esto en un perfil, no se fusiona con los complementos definidos en los perfiles principales, sino que los anula. Si define el mismo complemento directamente en la sección de compilación, funciona. Para Maven3 se resolvió como se esperaba.
Greg Domjan
A mi no me sirvió. Quería reconstruir Jenkins NodeJS Plugin v1.0 con la versión 1.580.1 de org.jenkins-ci.plugins en pom.xml usando Maven 3.3.9. Hasta que cambié manualmente <source> a 1.7 en ~ / .m2 / repository / org / jenkins-ci / jenkins / 1.34 / jenkins-1.34.pom, nada funcionó.
Alexander Samoylov
6

Tuve el mismo problema. De forma predeterminada, mi complemento de guerra maven excluía un archivo html. Pero en mi perfil de pruebas de aceptación quería que se incluyera este archivo. Entonces, cuando agregué el complemento de guerra de maven nuevamente, no anuló el predeterminado.

Para resolver este problema, pasé el atributo combine.self y funcionó bien.

Construcción predeterminada:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <packagingExcludes>swagger-ui/client.html</packagingExcludes>
    </configuration>
</plugin>

Perfil de prueba de aceptación:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.4</version>
    <configuration combine.self="override"/>
</plugin>
shane lee
fuente
1

¿Intentó desactivar el perfil wls7 (desde maven 2.0.10):

A partir de Maven 2.0.10, uno o más perfiles pueden desactivarse usando la línea de comando prefijando su identificador con el carácter '!' o '-' como se muestra a continuación:

mvn groupId:artifactId:goal -P !profile-1,!profile-2

Esto se puede utilizar para desactivar perfiles marcados como activeByDefault o perfiles que de otro modo se activarían a través de su configuración de activación.

Y luego agregue su configuración en un perfil con un nombre diferente o directamente en su pom.xml.

Pascal Thivent
fuente
Como dije anteriormente, no puedo deshacerme del POM principal ya que heredé muchas configuraciones definidas para toda mi empresa en diferentes niveles del marco. Y duplicar perfiles no debería ser una buena idea, porque necesitaría informar cambios en el POM principal y, por lo general, no los conozco. Solo me gustaría anular el comportamiento solo para la compilación de clases de prueba en mi proyecto.
Guillaume Cernier
Vuelve a leer mi respuesta, eso no es lo que sugerí. Sugerí desactivar un perfil, no deshacerme del POM principal. Entonces, ¿por qué tendría que informar cambios en el pom principal? Nada te obliga a hacer eso.
Pascal Thivent
Sí Pascal, gracias por tu ayuda, pero el problema es que si desactivo el perfil wls7 me deshago de mucha configuración (para otros plugins, cosas generales de maven, ...) que aún necesito. Y al informar cambios, me refería DEL POM principal a mi POM. Porque, con la solución que sugirió, necesitaría duplicar todo el POM padre (excepto la sección para la compilación de clases de prueba) y si el POM padre responsable cambia algo en su POM, debo ser advertido de cualquier cambio que sea no es el proceso actual y no es muy práctico.
Guillaume Cernier
Ohh, ok, lo entiendo ahora. Sin embargo, no estoy seguro (pero puedo estar equivocado) de que pueda anular un pom parcialmente, por lo que no tengo una mejor solución con los detalles proporcionados.
Pascal Thivent
De todos modos, muchas gracias Pascal por intentar ayudarme. De hecho, necesito tal comportamiento por una razón en particular. Quizás haya otra forma de realizarlo:
Guillaume Cernier