So aktivieren Sie ein Maven-Profil in einem abhängigen Modul?
Angenommen ich habe ein Modul A:jar
, deren Laufzeit und Zusammenstellung festlegen von Abhängigkeiten, hängt von der JDK-version. In meinem Beispiel habe ich eine pre-jdk6-profile
für JAXB API: vor JDK 1.6.0 ich müssen jaxb-api-nnn.jar
als compile-Abhängigkeit. Dieses Profil befindet sich A.pom
.
Ich habe auch Modul B:war
, das hängt davon ab A:jar
. Ich möchte in der Lage sein, um dieses Profil zu aktivieren auf einem build-server zu bauen, das JDK 1.5.x lieferbar. Wenn ich ausführen von Maven mit einem bestimmten Profil aktiviert ist, bekomme ich die Meldung:
mvn -Ppre-jdk6-profile -o install
[WARNING]
Profile with id: 'pre-jdk6-profile' has not been activated.
sowie jaxb-api-nnn.jar
fehlt in dem resultierenden B.war
. Allerdings wenn ich aktivieren Sie dieses Profil, wenn Gebäude von der übergeordneten pom.xml
ist alles OK. Das bedeutet, dass die profile nicht geerbt von Abhängigkeiten, und die übergeordnete multi-Modul pom.xml war in der Lage zu bauen ist alles richtig, weil es scheint, wie alle profile zusammengeführt, die im Reaktor.
Verschiebung des Profils zu übergeordneten pom macht die Dinge schlimmer, als die Abhängigkeiten angewendet werden, um alle anderen Projekte (z.B. C:ear
). Gibt es schön Lösungen für diese Aufgabe, nämlich dann, wenn jedes Modul A
hängt Modul B
, dann alle Kompilier-und Laufzeit-Abhängigkeiten werden aktiviert, indem Sie ein Profil, werden nun korrekt behandelt?
Des Profils im Projekt - A:jar
folgt:
<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>
Du musst angemeldet sein, um einen Kommentar abzugeben.
a) In einer multi-Modul-bauen, sollten Sie immer bauen aus den top-pom, nie aus einem einzelnen Modul. Wenn Sie bauen wollen, nur ein Modul, verwenden Sie die erweiterte Reaktor-Optionen (siehe mvn --help) wie folgt:
b) Definieren und aktivieren Sie das Profil in der parent-pom, sondern fügen Sie die Konfiguration in der child-pom.
Eltern pom.xml
Kind pom.xml
A
oder ModulB
?<scope>provided</scope>
in der webapp mit Standard-Umfang. Aber in beiden im Profil.A
undB
in meinem Fall). Profile sind miteinander verknüpft durch ID und sind tatsächlich "zusammengefügt" von oben nach unten.Mehrere Noten Weg, nach der Tat:
-P profName
es aktiviert ein Profil mit dem Namen 'profName'<activation>
tag für Sie. Es spielt keine Rolle, ob Sie aktiviert sind, indem Sie die java-version, wie im Beispiel, oder durch Standard-oder env-Wert oder nichts.Lösung: verwenden Sie Entweder
<activation><jdk>...</jdk></activation>
oder verwenden Sie-P
aber verwenden Sie nicht beide.pom.xml
), der aktiviert wird, ein Profil auf Basis der Java-version. Auch wenn wir explizit wählen Sie ein Profil, mit-P profName
, die Java-spezifische Profil noch aktiviert werden! Das gleiche gilt für andere "profile automatisch ausgelöst, basierend auf den erkannten Zustand des build-Umgebung", wie Maven Dokumentation freundlicherweise erklärt.