it-swarm.com.de

Können Maven-Projekte mehrere Eltern haben?

Wir haben Java- und Flex-Projekte am Werk. Wir haben derzeit 1 Basis-Pom, das die Konfigurationen enthält, die wir für beide Projekte verwenden möchten. Problem dabei ist: Flex-Projekte erben zum Beispiel die Konfiguration für javadoc und pmd, die sie nicht möchten.

Ich möchte dies etwas sauberer machen und habe einen echten Base-Pom und dann einen Java-Base-Pom und einen Flex-Base-Pom. Aber wie funktioniert das in einem Multimodul, das sowohl einen Flex-Part als auch einen Java-Part hat?

Wir haben Plugins für unsere eigene Anwendung, bei der wir die folgende Struktur verwenden:

  • mein-plugin
    • mein-plugin-client (flex)
    • my-plugin-server (Java)

Das my-plugin enthält nur eine pom.xml mit Abschnitt. Ich würde das my-plugin pom.xml als übergeordnetes Element für beide verwenden, aber dann kann ich das Java-Base-Pom oder das Flex-Base-Pom auch nicht als Elternteil verwenden. Was wäre der beste Ansatz dafür?

47
Wim Deblauwe

Ein Projekt kann nur über ein übergeordnetes Element verfügen (im Gegensatz zu Mehrfachvererbung in C++), dieses übergeordnete Element kann jedoch Teil einer größeren übergeordneten Hierarchie sein. Wie andere darauf hingewiesen haben, könnte man so etwas haben:

 base-pom /
 | - flex-base-pom 
 | | - mein-plugin-client 
 | | `- pom.xml 
 | `- pom.xml 
 | - Java-Basis-Pom 
 | | - mein-plugin-server 
 | | `- pom.xml 
 | `- pom.xml 
 `- pom.xml 

Ich habe bemerkt, dass Sie geschrieben haben, dass Ihr eigentliches Problem darin besteht, dass:

flex projects erben beispielsweise die Konfiguration für javadoc und pmd, die sie nicht möchten.

Sie sollten das Element pluginManagement verwenden, um diese Situation zu vermeiden:

pluginManagement ist ein Element, das neben den Side-Plugins angezeigt wird. Plugin-Management enthält Plugin-Elemente auf die gleiche Weise, mit der Ausnahme, dass Plugin-Informationen für diesen speziellen Projekt-Build nicht konfiguriert werden, sondern Projekt-Builds so konfiguriert werden sollen In diesem Fall werden nur Plugins konfiguriert, auf die tatsächlich innerhalb des Plugins-Elements in den untergeordneten Elementen verwiesen wird. Die untergeordneten Elemente haben das Recht, PluginManagement-Definitionen zu überschreiben.

Konfigurieren Sie also im übergeordneten Pom Ihre Plugins in pluginManagement (z. B. javadoc und pmd) und referenzieren Sie sie innerhalb des plugins-Elements in den gewünschten untergeordneten Elementen (hier nur in meinem Plugin-Server). Dies würde Ihr aktuelles Problem lösen.

30
Pascal Thivent

Obwohl Maven-Projekte Alleinerziehende haben, können sie eine beliebige Anzahl anderer Pom's wie folgt importieren:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>my-shared-dependencies</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
<dependencyManagement>

Dies hat zwei wichtige Unterschiede zu einem übergeordneten Element:

  1. Im importierten Pom definierte Plugins werden nicht importiert
  2. Im importierten Pom definierte Abhängigkeiten werden nicht zum aktuellen Pom hinzugefügt. Importiert nur Abhängigkeiten in den Abhängigkeitsverwaltungsabschnitt.  

Wenn Ihr übergeordnetes Pom jedoch einen <dependencies> -Abschnitt hat und Sie diese in Ihre Abhängigkeiten aufnehmen möchten, können Sie das übergeordnete Element wie eine reguläre Abhängigkeit zum Abhängigkeitsabschnitt hinzufügen:

<dependency>
    <groupId>org.example</groupId>
    <artifactId>my-shared-dependencies</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

Obwohl dieselbe Abhängigkeit bereits importiert wurde, muss das Versions-Tag erneut angegeben werden. Um die Duplizierung zu reduzieren, kann es in einer Eigenschaft gespeichert werden

17
Peter Szanto

Die einzige Möglichkeit ist, base-pom als übergeordnetes Element von Java-base-pom und flex-base-pom zu verwenden.

Ich habe eine ähnliche Struktur für meine Frühjahrsprojekte:

base-pom (basic configuration - Eclipse, reports, repositories, etc)
|
+ spring-base-pom (spring definitions)
  |
  + spring-jar-base-pom (jar specific definitions)
  |
  + spring-war-base-pom (spring web and servlet dependencies)
    |
    + spring-webapp-base_pom (spring web mvc dependencies)
6

Ich habe dieses Problem auch gekreuzt und die beste Lösung, die ich gefunden habe, war die Verwendung von Vererbung und Aggregation wie in dieser Frage vorgeschlagen: Unterstützt Maven mehrere Eltern (Mehrfachvererbung)?

Sie können einen Aggregator-Pom haben, der nicht das übergeordnete Projekt ist. Aggregate.

und erklären in der Maven-Dokumentation

Vererbung und Aggregation erzeugen eine Nice-Dynamik, um Builds durch ein einzelnes POM auf hoher Ebene zu steuern (...). Umgekehrt kann ein POM-Projekt Projekte zusammenfassen, die nicht von diesem erben.

Von diesem hatte ich die Vererbung meines POMs (pom-master enthält Kommunalkonfigurationen, und jedes Kind hat die spezifischen Eigenschaften):

 pom-master 
 | - pom-Java 
 | - pom-flex 

und so kann mein Projekt die Details für die einzelnen Modulkonfigurationen wie gewünscht erhalten:

 Projekt (aggregiertes Projekt-Flex & Projekt-Java) 
 | - project-Java 
 | `- pom.xml => parent = pom-Java 
 | - project-flex 
 | `- pom.xml ==> parent = pom-flex 
 `- pom.xml => parent = pom-master 

Hoffe, es wird auch anderen helfen :)

4
LE GALL Benoît

Stellen Sie sich nur vor, dass pom.xml tatsächlich Java-Klassen sind: Sie können nur ein übergeordnetes Element haben (oder eine Klasse erweitern), aber dieses übergeordnete Element kann auch ein anderes übergeordnetes Element usw. haben.

Wie ich hier erklärt habe, müssen Sie die übergeordneten und die Aggregationsprinzipien in Maven unterscheiden, was bedeutet, dass mein Plugin als Aggregationsprojekt betrachtet wird und nicht unbedingt als übergeordnetes Projekt sowohl für meinen Plugin-Client als auch für mein Plugin -Elternteil.

Also zusammenfassend:

my-plugin definiert den Basis-Pom für alle Ihre Projekte. Anschließend erstellen Sie zwei neue pom - Projekte: Java-base-pom und flex-base-pom. Sie haben beide my-plugin als übergeordnetes Element. Jetzt hat mein Plugin-Client Java-base-pom als übergeordnetes Element, während mein Plugin-Server flex-base-pom für sein Elternteil verwendet.

Auf diese Weise erbt my-plugin-client alle Eigenschaften, die in der Datei my-plugin pom.xml sowie im Projekt Java-base-pom definiert sind.

2
Romain Linsolas

Mit Profilen können Sie Mehrfachvererbung erreichen:

Sie erstellen (mehrere) Profile im Root-Pom und aktivieren automatisch jede Variation dieser Profile, um eine mehrfache Vererbung der Maven-Konfiguration zu erreichen.

0
sibidiba