2011-01-11 6 views
8

Ich kämpfe derzeit mit Maven: Ich habe ein komplexes Projekt aus mehreren verschachtelten Modulen und für einige dieser Module habe ich ähnliche Konfigurationen in den POMs.Wie teile ich POM-Fragmente zwischen verschiedenen POMs?

Ich möchte es sauber machen. Eigentlich würde ich gerne eine "runnable-jar" allgemeine Konfiguration definieren und sie in einigen Modulen aktivieren.

Hier wird das POM-Fragment, das ich zwischen mehreren Projekten teilen möchten:

<build> 
    <plugins> 
     <plugin> 

     <artifactId>maven-assembly-plugin</artifactId> 
     <configuration> 

      <!-- Use a custom descriptor, with suffix "bin" --> 
      <descriptors> 
       <descriptor>src/main/assembly/runnable-jar-assembly.xml</descriptor> 
      </descriptors> 

      <!-- Add main class to manifest --> 
      <archive> 
       <manifest> 
        <mainClass>${mainClass}</mainClass> 
       </manifest> 
      </archive> 

     </configuration> 

     <!-- Add build of this package to lifecycle --> 
     <executions> 
      <execution> 
       <id>make-runnable-jar</id> 
       <phase>package</phase> 
       <goals> 
        <goal>single</goal> 
       </goals> 
      </execution> 
     </executions> 

     </plugin> 
    </plugins> 
</build> 

In einigen der POMS, würde ich gerne der Lage sein, etwas zu tun, wie: Ich

<!-- Set the main class --> 
<properties> 
    <mainClass>my.main.Class</mainClass> 
</properties> 

<!-- Activate runnable jar build --> 
<import>src/main/pom/runnable-jar-pom.xml</import> 

habe nach einem Mittelwert gesucht, um einige XML-Fragmente in ein POM zu importieren oder ein ganzes XML-Nodeset-Makro zu definieren.

Für das, was ich gefunden habe, wäre die nächste Lösung, ein Profil im übergeordneten POM zu definieren und es in einigen Untermodulen zu aktivieren, indem das Vorhandensein einer Datei getestet wird. See this related question. Aber ich bin mit dem Problem konfrontiert, dass die Eigenschaft {basedir} nicht korrekt geerbt/gesetzt ist.

Ich finde es sehr überraschend, einen Hack zu brauchen, um etwas so grundlegendes zu tun (= üblich). Wie gehst du normalerweise mit Maven um?

Antwort

6

Ich habe gerade etwas entdeckt, das mein Problem lösen könnte:

Ein Modul benötigt keine sein Submodul seines übergeordneten Moduls.

Eltern und -Submodul Beziehungen sind separate Konzepte.

Sie können eine übergeordnete POM-Modul angeben, die nicht der tatsächlichen übergeordneten Ordner in der Ordnerstruktur ist, unter Verwendung des relativePath Attribut (as explained in the doc)

In meinem Fall verwende ich das folgende Layout:

  • Hauptprojekt
    • utils (parent: Hauptprojekt)
    • cli-Programme (parent: Hauptprojekt)
      • generic-cli (parent: cli-Programme; Dummy & leer POM-Modul)
      • cli-1 (parent: generic-cli)
      • cli-2 (parent: generic-cli)

Dann kann ich in generic-cli/pom.xml eine Konfiguration deklarieren, die c ist ommon zu allen meinen cli-Programmen (wie kundenspezifische Testsuiten, runable-jar Verpackung, usw.).

0

keine vollständige Antwort, aber eine Lösung des Problems basedir besteht darin, ein gemeinsames Layout der Module zu verwenden, z. root/modules/moduleA root/modules/moduleB.

Sie können die Module nicht mehr in einem eigenen Verzeichnis erstellen, sondern nur über das übergeordnete Projekt. Aber Sie können mit den Profilen arbeiten.

5

Ein Weg, dies zu tun wäre, um Ihre <plugin> Code innerhalb <pluginManagement> der Eltern POM Ihres Multi-Modul-Projekt zu deklarieren. Die einzelnen Module können dann einen <plugin> Abschnitt haben, der dies verwenden kann, ohne den Inhalt neu zu deklarieren.

Eltern pom:

<pluginManagement> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-assembly-plugin</artifactId> 
       ... all the details... 
     </plugin> 
     ... 
    </plugins> 
</pluginManagement> 

Kinder Poms:

 <plugins> 
     ... 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-assembly-plugin</artifactId> 
     </plugin> 
    </plugin> 
+0

Schön. Ich war mir dieser Möglichkeit nicht bewusst. –