2010-08-20 6 views
7

Supposons que je possède un module A:jar, dont l'ensemble de dépendances et d'exécution dépend de la version du JDK. Dans mon exemple, j'ai un pre-jdk6-profile pour API JAXB: avant JDK 1.6.0, j'ai besoin d'inclure jaxb-api-nnn.jar comme une dépendance de compilation. Ce profil est placé à A.pom. J'ai également le module B:war, qui dépend de A:jar. Je veux être en mesure d'activer ce profil sur un serveur de construction pour créer le livrable JDK 1.5.x. Lorsque j'exécute Maven avec un profil donné activé, je reçois le message:Comment activer un profil Maven dans un module dépendant?

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

et jaxb-api-nnn.jar manque dans B.war résultant. Toutefois, si j'active ce profil lors de la construction à partir du parent pom.xml, tout est OK. Cela signifie que les profils ne sont pas hérités des dépendances, et le pom.xml multi-module parent a pu tout construire correctement car il semble que tous les profils sont fusionnés dans le réacteur.

Le décalage du profil vers le pom parent rend les choses plus difficiles, car les dépendances sont appliquées à tous les autres projets (par exemple, C:ear). Existe-t-il de bonnes solutions pour cette tâche, à savoir, si un module A dépend du module B, alors toutes les dépendances de compilation et d'exécution qui sont activées par un profil sont correctement gérées?

Le profil dans le projet A:jar suit:

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

Répondre

8

a) Dans une construction à plusieurs modules, vous devez toujours construire à partir du haut pom, jamais à partir d'un module individuel. Si vous voulez construire un seul module, utiliser des options avancées de réacteurs (voir mvn --help) comme ceci:

mvn -pl mymodule 

b) Définir et activer le profil dans la pom-mère, mais ajoutez la configuration chez l'enfant pom .

parent pom.xml

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

enfant pom.xml

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

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

Dois-je ajouter la 2ème partie au module 'A' ou au module' B'? –

+0

les deux. Dans le JAR avec ' fourni', dans la webapp avec la portée par défaut. Mais dans les deux à l'intérieur du profil. –

+0

Je crois, je peux utiliser seulement (b) si je cours construit sur Hudson.Merci pour vos conseils. –

1

Plusieurs notes façon après le fait:

  1. Lorsque vous utilisez -P profName, il active un profil nommé ' profName '
  2. Après cela, il désactive tous les profils s qui ont un tag <activation> pour eux. Peu importe qu'ils soient activés par la version java, comme dans l'exemple, ou par défaut ou par valeur env ou quoi que ce soit.
  3. Cela signifie que -P provoque la désactivation de tout profil activé.

Solution: Utilisez <activation><jdk>...</jdk></activation> ou utilisez -P mais n'utilisez pas les deux.

Questions connexes