2010-02-11 12 views
14

Ich habe ein multimodul Maven2-Projekt, das eine Webanwendung erstellt. Die Anwendung ist mit einem Backend-Server und einer Datenbank verbunden. Es gibt mehrere Serverinstanzen in unserer Umgebung bereitgestellt, und es gibt auch mehrere Backend und DB-Instanzen für Entwicklung, UAT, Produktion, etc. So praktisch jede Anwendungskonfiguration benötigt diese drei Koordinaten:Warum kann ich ein Maven2-Profil nicht von einem anderen Profil aus aktivieren?

  • Front-End-Server
  • back-End-Server
  • DB

ich auf vereinigende arbeite und die Automatisierung der Anwendungskonfiguration. Es ist einfach und offensichtlich, diese verschiedenen Konfigurationen als Profile in Maven darzustellen. Dann kann ich eine spezifische Konfiguration erstellen, indem ich ein Profil von jeder Gruppe, z.

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

Dies ist ein bisschen langweilig zu schreiben und zu fehleranfällig - wenn ein bestimmte Server falsch konfiguriert ist zur falschen DB zu verbinden, kann der Preis hoch sein. Eine naheliegende Möglichkeit, dies zu beheben, wäre es, alle nützlichen Profilkombinationen in Skriptdateien einzufügen.

Aber ich dachte, dass ich cleverer sein könnte, indem ich das notwendige Back-End- und DB-Profil direkt vom Serverprofil aktiviere. Die Serverprofile sind im Hauptpom, z.B.

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

Und die Back-End und DB-Profile sind in der Pom des Config-Submoduls, z.

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

Also in der Theorie, da die server.myserver Profil der db Eigenschaft auf dev02 setzt, sollte dies die Aktivierung des db.dev02 Profil in dem Kind pom auslösen. Dies geschieht jedoch nicht. (Auch wenn die beiden Profile im selben Pom sind, btw). Wenn ich die Eigenschaft von der Kommandozeile mit

mvn -Ddb=dev02 help:active-profiles 

gesetzt dann wird das Profil jedoch aktiviert, so scheinbar habe ich nichts falsch geschrieben.

Habe ich etwas übersehen? Gibt es einen anderen Weg, um das zu funktionieren?

Ich sehe, dass es eine ähnliche Frage besteht: Can I make one maven profile activate another?
jedoch IMHO dies kein Duplikat ist - ich sehe, dass mein Ansatz nicht funktioniert und ich würde verstehen, warum mag. (Ich habe die Referenz gelesen, aber vielleicht habe ich etwas offensichtlich übersehen).

Antwort

16

Die Funktion existiert einfach nicht. Der Property-Aktivator verwendet die eingehenden Eigenschaften, nicht irgendetwas, das durch die Profile festgelegt wird (andernfalls würde es nicht wissen, in welcher Reihenfolge sie ohne eine komplexere Logik aktiviert werden sollen).

Die von Ihnen verwendete Lösung mit identischen Eigenschaften, um die Dinge zu aktivieren, die Sie zusammen machen möchten, ist die beste Lösung. Mir ist klar, dass das nicht immer zufriedenstellend ist. In diesem Fall können Sie einfach nur die einzelnen Profile so einfach wie möglich gestalten, damit Sie sie in der Befehlszeile beliebig kombinieren können, ohne dass Sie die Objekte duplizieren.

Die Ausgabe dieser Funktion bedeckt ist: https://issues.apache.org/jira/browse/MNG-3309
Die Frage die Eigenschaft Aktivierung Abdeckung ist: https://issues.apache.org/jira/browse/MNG-2276

+0

@Brett, danke, das hat alles gelüftet. Eine letzte Sache jedoch: Sie haben geschrieben: "Die Lösung, die Sie benutzt haben, hat identische Eigenschaften, um die Dinge zu aktivieren, die Sie zusammen machen wollen, ist die beste Lösung." In welchem ​​Sinne? Ästhetisch vielleicht, aber es funktioniert immer noch nicht ... –

+1

Ich meinte die eine "von der Kommandozeile". Wenn Sie also "profile1" benötigen, um zu signalisieren, dass "profile2" aktiviert ist, stellen Sie sicher, dass beide mit 'propertyX' aktiviert sind, und verwenden Sie' mvn -DpropertyX' anstelle von 'mvn -Profile1'. Es ist nicht ganz so flexibel wie das, wonach Sie gesucht haben. –

3

Issue MNG-2276 von Brett erwähnt wurde Maven 3.x behoben, so dass Sie nun definieren Eigenschaften in den Einstellungen erlaubt sind. XML, um Profile in Ihrem Pom auszulösen. Hier ein Beispiel:

In settings.xml:

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

In Ihrem pom (oder besser noch, in Ihrer Mutter pom):

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

Gute Idee Enforcer-Plugin zu verwenden zu zwingen mvn 3.0 oder höher:

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