2010-08-20 13 views
7

Supongamos que tengo un módulo A:jar, cuyo tiempo de ejecución y conjunto de dependencias de compilación dependen de la versión JDK. En mi ejemplo, tengo un pre-jdk6-profile para JAXB API: antes de JDK 1.6.0 necesito incluir jaxb-api-nnn.jar como una dependencia de compilación. Este perfil se coloca en A.pom.¿Cómo activar un perfil de Maven en un módulo dependiente?

También tengo el módulo B:war, que depende de A:jar. Quiero poder activar este perfil en un servidor de compilación para compilar el archivo JDK 1.5.x entregable. Cuando ejecuto Maven con un perfil determinado activado, aparece el mensaje:

mvn -Ppre-jdk6-profile -o install 
[WARNING] 
     Profile with id: 'pre-jdk6-profile' has not been activated. 

y jaxb-api-nnn.jar no se encuentra en B.war resultante. Sin embargo, si activo este perfil al compilar desde el padre pom.xml, todo está bien. Eso significa que los perfiles no se heredan de las dependencias, y el módulo principal pom.xml fue capaz de construir todo correctamente porque parece que todos los perfiles se fusionaron en el reactor.

Cambiar el perfil a parent pom empeora las cosas, ya que las dependencias se aplican a todos los demás proyectos (por ejemplo, a C:ear). ¿Hay buenas soluciones para esta tarea, es decir, si cualquier módulo A depende del módulo B, entonces todas las dependencias de compilación y tiempo de ejecución que se activan por un perfil, se manejan correctamente?

El perfil de proyecto A:jar sigue:

<project ...> 
    <artifactId>A</artifactId> 
    <packaging>jar</packaging> 
    ... 
    <parent> 
     <artifactId>P</artifactId> 
     ... 
    </parent> 

    <profiles> 
     <profile> 
      <id>pre-jdk6-profile</id> 

      <activation> 
       <jdk>(,1.6.0)</jdk> 
      </activation> 

      <dependencies> 
       <dependency> 
        <groupId>javax.xml.ws</groupId> 
        <artifactId>jaxws-api</artifactId> 
       </dependency> 
      </dependencies> 
     </profile> 
    </profiles> 
... 
</project> 

Respuesta

8

a) En una acumulación de varios módulos, debe construir siempre desde la parte superior del pom, nunca de un módulo individual. Si usted quiere construir un solo módulo, utilizar las opciones de reactores avanzados (ver --help MVN) así:

mvn -pl mymodule 

b) Definir y activar el perfil en el pom de los padres, además de añadir la configuración en el pom niño .

pom.xml padres

<profiles> 
    <profile> 
     <id>pre-jdk-6</id> 
     <activation> 
      <jdk>(,1.6.0)</jdk> 
     </activation> 
    </profile> 
</profiles> 

pom.xml niño

<profiles> 
    <profile> 
     <id>pre-jdk-6</id> 

     <dependencies> 
      <dependency> 
       <groupId>javax.xml.ws</groupId> 
       <artifactId>jaxws-api</artifactId> 
      </dependency> 
     </dependencies> 
    </profile> 
</profiles> 
+0

¿Debo agregar la segunda parte al módulo 'A' o al módulo' B'? –

+0

ambos. En el JAR con ' proporcionado', en la aplicación web con alcance predeterminado. Pero en ambos dentro del perfil. –

+0

Creo que solo puedo usar (b) si ejecuto compilaciones en Hudson.Gracias por tus consejos. –

1

Varias notas manera después de los hechos:

  1. Cuando se utiliza -P profName, se activa un perfil denominado ' profName '
  2. Después de eso, desactiva todo perfil s que tienen una etiqueta <activation> para ellos. No importa si están activados por la versión java, como en el ejemplo, o por defecto o valor env o cualquier otra cosa.
  3. Eso significa que -P hace que se desactive cualquier otro perfil activado.

Solución: Use <activation><jdk>...</jdk></activation> o use -P pero no use ambos.

Cuestiones relacionadas