2014-02-05 9 views
7

Ich versuche, Projekt mit Submodulen zu bekommen, um Berichte zu testen und korrekt zu generieren, aber habe einige Probleme.Maven Reporting und Site-Generierung für mehrere Module Projekt

Ich habe die folgende Projektstruktur:

parent 
    |-test1 
    |-test2 

und die pom.xml für parent sieht wie folgt aus:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
<modelVersion>4.0.0</modelVersion> 
<groupId>parent</groupId> 
<artifactId>parent</artifactId> 
<version>1.0.0-SNAPSHOT</version> 
<packaging>pom</packaging> 

<modules> 
    <module>test1</module> 
    <module>test2</module> 
</modules> 

<build> 
    <pluginManagement> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-surefire-plugin</artifactId> 
       <version>2.16</version> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-surefire-report-plugin</artifactId> 
       <version>2.16</version> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-site-plugin</artifactId> 
       <version>3.3</version> 
      </plugin> 
     </plugins> 
    </pluginManagement> 
</build> 

<reporting> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-report-plugin</artifactId> 
      <configuration> 
       <aggregate>true</aggregate> 
       <reportsDirectories> 
        <reportsDirectory>${basedir}/target/surefire-reports</reportsDirectory> 
       </reportsDirectories> 
      </configuration> 
      <reportSets> 
       <reportSet> 
        <inherited>false</inherited> 
        <reports> 
         <report>report-only</report> 
        </reports> 
       </reportSet> 
      </reportSets> 
     </plugin> 
    </plugins> 
</reporting> 

Und ich mvn clean install site das Projekt zu erstellen, führen Sie die Tests und generieren eine Website (die das maven site plugin verwendet, das wiederum maven todayfire report plugin verwendet, um einen Testbericht zu erstellen).

Das Problem ist die Mutter pom.xml ist mit allen Phasen (sauber, installieren und Website) ausgeführt, bevor Submodule pom.xml ausgeführt werden, damit kein Prüfbericht test1 und test2 werden in parent aggregiert.

Also gibt es eine Möglichkeit, mvn clean install site in einer einzigen Zeile auszuführen, oder muss ich unbedingt mvn clean install zuerst dann mvn site ausführen?

Vielen Dank für Anregungen.

Antwort

16

Die angezeigte Konfiguration verwendet dasselbe POM wie das übergeordnete und das Aggregat. In der Dokumentation wird auch Vererbung vs. Multi-Modul diskutiert. Ein Eltern-POM übergibt Werte an seine untergeordneten Elemente, während ein Aggregator-POM eine Gruppe von Unterprojekten oder Modulen verwaltet. Abschnitt 3.6.2 der Sonatype Maven Book geht in viel mehr Details.

Nach meiner Erfahrung funktioniert Maven besser, wenn die Eltern- und Aggregator-POMs getrennt sind.

Der Grund hat mit Abhängigkeiten zu tun, wie Maven die Build-Reihenfolge bestimmt und wie Maven Befehle ausführt. Wenn Ihre Probenstruktur wie das war, mit einem separaten Eltern- und Aggregator, wo test1 und test2 von den Eltern geerbt:

project (aggregator POM) 
    |- parent 
    |- test1 
    |- test2 

dann bauen die Maven Reihenfolge wie folgt aussehen (vorausgesetzt, Abhängigkeiten korrekt natürlich definiert sind):

  • Mutter
  • Test1
  • test2
  • Aggregator

Ein Befehl wie mvn clean install site beginnt mit dem übergeordneten Projekt, bereinigt und erstellt, installiert das lokale Artefakt-Repository und generiert dann den Projektstandort. Es wiederholt diese Befehlssequenz in der Reihenfolge für jedes gezeigte Projekt. Da der Aggregator separat ist, kann er eine separate Konfiguration aufweisen, um die Berichtsaggregation für Tests, Coverage und Javadoc durchzuführen. Da der Aggregator zuletzt ausgeführt wird, sind die Coverage-Datenbanken und die dazwischen liegenden Javadoc-Dateien für die Module bereits vorhanden und können entsprechend kombiniert werden.

Wenn die Eltern und Aggregator die gleiche POM sind, wie Sie es haben, die Build-Reihenfolge ist:

  • parentAggregator
  • test1
  • test2

Wenn Sie mvn clean install site jetzt laufen, Maven muss das übergeordnete POM (hier parentAggregator) erstellen, damit es die für die untergeordneten Module erforderlichen Informationen erhält. parentAggregator ist auch der Aggregator. Daher wird Maven gerne alle Aggregationsberichte als Teil von site ausführen. Natürlich wurden die untergeordneten Module noch nicht erstellt, so dass keine Coverage-Datenbanken oder dazwischenliegende Javadoc-Dateien aggregiert werden müssen. Oder, schlimmer noch, alte Dateien existieren, so dass der Aggregator mit diesen Dateien arbeitet. Nachdem der Parent-Aggregator erstellt wurde, werden die untergeordneten Module erstellt, und anschließend wird der Befehl beendet. Es gibt keinen abschließenden Aggregationsschritt am Ende des Builds. Die Gesamtergebnisse sind wahrscheinlich nicht das, was Sie wollen.

Dieses Phänomen kann Probleme bei der Erstellung von Multi-Modul-Projektversionen verursachen, die so schmerzhaft sind, dass die Entwickler eine versions-maven-plugin mojo schreiben, um sie zu korrigieren. Das Problem:

Wenn Sie ein Multi-Modul zu bauen, wo der Aggregator pom (dh die mit dem Verpacken von pom und dem Abschnitt Module) ist auch die Mutter durch seinen untergeordneten Module Bezug genommen wird, und die Aggregator-Version nicht stimmen Sie mit der Version überein, die im übergeordneten Abschnitt der untergeordneten Module angegeben ist. Maven lässt Sie das Projekt nicht erstellen.

+1

Vielen Dank für Ihren Vorschlag über Aggregator, die eine gute Lösung für dieses Problem ist. Und Sie haben auch richtig vorhergesagt "alte Dateien existieren, so dass der Aggregator mit diesen Dateien arbeitet" :) – stackoverflower