2010-02-11 10 views
14

J'ai un projet multimodule Maven2 qui construit une application web. L'application est connectée à un serveur principal et à une base de données. Il y a plusieurs instances de serveur déployé dans notre environnement, et il y a aussi backend multiples et instances DB pour le développement, UAT, production, etc. Donc, pratiquement, chaque configuration de l'application a besoin de ces 3 coordonnées:Pourquoi ne puis-je pas activer un profil Maven2 à partir d'un autre profil?

  • serveur frontal
  • back-end serveur
  • DB

Je travaille à unifier et à l'automatisation de la configuration de l'application. Il est facile et évident de représenter ces différentes configurations en tant que profils dans Maven. Ensuite, je peux créer une configuration spécifique en activant un profil de chaque groupe, par ex.

mvn -Pserver.Server1,backend.prod,db.uat clean install 

C'est un peu fastidieux de type et sujette à erreur - si un serveur spécifique est mal configuré pour se connecter au mauvais DB, le prix peut être élevé. Une façon évidente de résoudre ce problème serait de placer toutes les combinaisons de profils utiles dans des fichiers de script.

Mais je pensais que je pourrais être plus intelligent que cela en activant le back-end nécessaire et le profil DB directement à partir du profil du serveur. Les profils de serveur sont dans le pom principal, par ex.

<profile> 
    <id>server.myserver</id> 
    <properties> 
     <jboss.home>D:\Programs\jboss-4.2.1.GA</jboss.home> 
     <server.name>NightlyBuild</server.name> 
     <hosttobind>192.168.1.100</hosttobind> 
     <servlet.port>8080</servlet.port> 
     ... 
     <db>dev02</db> 
    </properties> 
</profile> 

Et les profils de base et de base de données se trouvent dans le sous-module Config, par ex.

<profile> 
    <id>db.dev02</id> 
    <activation> 
     <property> 
      <name>db</name> 
      <value>dev02</value> 
     </property> 
    </activation> 
    <properties> 
     <jdbc.address>jdbc:oracle:thin:@192.168.0.101:1521:dbdev02</jdbc.address> 
    </properties> 
</profile> 

Donc, en théorie, puisque le profil server.myserver définit la propriété db à dev02, cela devrait déclencher l'activation du profil db.dev02 chez l'enfant pom. Cependant, cela n'arrive pas. (Ni si les deux profils sont dans le même pom, btw). Si je mets la propriété de la ligne de commande avec

mvn -Ddb=dev02 help:active-profiles 

alors le profil est activé, donc apparemment je n'ai rien mal orthographié.

Ai-je oublié quelque chose? Y a-t-il un autre moyen de faire ce travail?

Je vois qu'il existe une question similaire: Can I make one maven profile activate another?
Cependant, à mon humble avis ce n'est pas un double - je vois qui ne fonctionne pas mon approche et je voudrais comprendre pourquoi. (J'ai lu la référence, mais j'ai peut-être oublié quelque chose d'évident).

Répondre

16

La fonctionnalité n'existe tout simplement pas. L'activateur de propriété utilise les propriétés entrantes, et non les éléments définis par les profils (sinon, il ne sait pas dans quel ordre les activer sans une logique plus complexe).

La solution que vous avez utilisée, d'avoir des propriétés identiques pour activer les choses que vous voulez faire ensemble, est la meilleure solution. Je me rends compte que cela peut ne pas toujours être satisfaisant - dans ce cas, tout ce que vous pouvez faire est de rendre les profils individuels aussi simples que possible afin de les combiner comme vous le souhaitez sur la ligne de commande, sans dupliquer les choses.

La question qui couvre cette fonction est: https://issues.apache.org/jira/browse/MNG-3309
La question portant sur l'activation de la propriété est: https://issues.apache.org/jira/browse/MNG-2276

+0

@Brett, merci, cela a éclairci les choses. Une dernière chose cependant: vous avez écrit "La solution que vous avez utilisée, d'avoir des propriétés identiques pour activer les choses que vous voulez faire ensemble, est la meilleure solution.". Dans quel sens? Esthétiquement peut-être, mais ça ne marche toujours pas ... –

+1

Je voulais dire celui "de la ligne de commande". Donc, si vous avez besoin de 'profile1' pour impliquer que' profile2' est activé, assurez-vous qu'ils sont activés avec 'propertyX', puis utilisez' mvn -DpropertyX' au lieu de 'mvn -Pprofile1'. Ce n'est pas aussi flexible que ce que vous cherchiez. –

3

Issue MNG-2276 mentionné par Brett a été résolu dans 3.x maven, vous êtes maintenant autorisé à définir les propriétés dans les paramètres. xml pour déclencher des profils dans votre pom. Voici un exemple:

settings.xml:

<profile> 
    <id>localDist</id> 
    <activation> 
     <property><name>localDist</name></property> 
    </activation> 
    <properties> 
     <doReleaseTasks>true</doReleaseTasks> 
    </properties> 
</profile> 

Dans votre pom (ou mieux encore, dans votre pom-mère):

<profile> 
    <id>doReleaseTasks</id> 
    <activation> 
     <property><name>doReleaseTasks</name></property> 
    </activation> 
    <build> 
     <plugins> 
      ... mvn -DlocalDist will activate these plugins 
     </plugins> 
    </build> 
</profile> 

Bonne idée d'utiliser le plugin enforcer pour forcer mvn 3.0 ou plus:

<build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-enforcer-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>enforce-maven</id> 
        <goals> <goal>enforce</goal> </goals> 
        <configuration> 
         <rules> 
          <requireMavenVersion> 
           <version>[3.0,)</version> 
           <message> 
*** Maven 3.x required to allow cascading profiles to be activated in settings.xml (MNG-2276) 
           </message> 
          </requireMavenVersion> 
         </rules> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build>