2010-02-11 7 views
14

Tengo un proyecto multimodulo Maven2 que crea una aplicación web. La aplicación está conectada a un servidor backend y una base de datos. Hay varias instancias del servidor desplegadas en nuestro entorno, y también hay varias instancias de backend y DB para el desarrollo, UAT, producción, etc Por lo tanto, prácticamente, cada configuración de la aplicación necesita estas coordenadas: 3¿Por qué no puedo activar un perfil de Maven2 desde otro perfil?

  • servidor front-end
  • back-end de servidor
  • DB

estoy trabajando en la unificación y la automatización de la configuración de la aplicación. Es fácil y obvio representar estas diferentes configuraciones como perfiles en Maven. Luego, puedo crear una configuración específica activando un perfil de cada grupo, p.

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

Esto es un poco tedioso para escribir y propenso a errores - si un servidor específico está mal configurado para conectarse a la base de datos equivocada, el precio puede ser alto. Una forma obvia de solucionar esto sería poner todas las combinaciones de perfiles útiles en archivos de script.

Pero pensé que podría ser más astuto que eso activando el back-end y el perfil de base de datos necesarios directamente desde el perfil del servidor. Los perfiles del servidor están en el pom principal, p.

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

y los perfiles de back-end y DB están en el pom del submódulo de configuración, por ejemplo,

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

tanto, en teoría, ya que el perfil server.myserver establece la propiedad db a dev02, esto debe dar lugar a la activación del perfil db.dev02 en el pom niño. Sin embargo, esto no sucede. (Ni si los dos perfiles están en el mismo pom, por cierto). Si establece la propiedad de la línea de comandos con

mvn -Ddb=dev02 help:active-profiles 

a continuación, el perfil se activa sin embargo, lo que al parecer no he escrito mal nada.

¿He pasado por alto algo? ¿Hay alguna otra manera de hacer que esto funcione?

veo que existe una pregunta similar: Can I make one maven profile activate another?
Sin embargo, en mi humilde opinión esto no es un duplicado - Veo que mi enfoque no funciona y me gustaría entender por qué. (He leído la referencia, pero podría haber pasado por alto algo obvio).

Respuesta

16

La función simplemente no existe. El activador de propiedad utiliza las propiedades entrantes, no nada establecido por los perfiles (de lo contrario, no sabría en qué orden activarlos sin una lógica más compleja).

La solución que utilizó, de tener propiedades idénticas para activar las cosas que desea hacer juntas, es la mejor solución. Me doy cuenta de que puede que no siempre sea satisfactorio; en ese caso, todo lo que puede hacer es volverse lo más simple posible para que pueda combinarlos de la manera que desee en la línea de comandos, sin duplicar cosas entre ellos.

La cuestión que cubre esta función es: https://issues.apache.org/jira/browse/MNG-3309
La cuestión que abarca la activación propiedad es: https://issues.apache.org/jira/browse/MNG-2276

+0

@Brett, gracias, esto lo solucionó todo. Una última cosa, sin embargo: escribiste "La solución que utilizaste, de tener propiedades idénticas para activar las cosas que quieres hacer juntas, es la mejor solución". ¿En qué sentido? Estéticamente, tal vez, pero todavía no funciona ... –

+1

Me refiero a la "desde la línea de comandos". Entonces, si necesita 'profile1' para implicar que' profile2' está activado, asegúrese de que ambos estén activados con 'propertyX', luego use' mvn -DpropertyX' en lugar de 'mvn -Pprofile1'. No es tan flexible como lo que estabas buscando. –

3

Issue MNG-2276 mencionado por Brett se resolvió en 3.x experto, por lo que ahora se permite definir las propiedades de configuración. xml para activar perfiles en tu pom. He aquí un ejemplo:

En settings.xml:

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

En su pom (o mejor aún, en su pom padre):

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

buena idea utilizar el plug-in para forzar ejecutor mvn 3.0 o superior:

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