Rapportgenerering med Maven för multimodule project

Att konfigurera upp rapporter för en modul i ett Maven 2-bygge är enkelt, man specificerar helt enkelt vilka rapporter som ska genereras i sin POM under report-taggen. Om ett projekt består av flera moduler (ett så kallat multimodule-project) vill man typiskt aggregera ihop rapporterna från de olika sub-modulerna, exempelvis en aggregerad vy över de JUnit-tester som körts. Detta stöd fanns för Maven 1.x via rapportpluginen Dashboard. Nu finns en någorlunda stabil version av denna plugin även för Maven 2.

Dashboard aggregerar följande rapporter:

Några övriga rapporter som kan vara intressanta:

  • JavaDoc – API-dokumentation
  • JXR – Källkoden i HTML-format (flera av rapporterna länkar till denna källkod)
  • JavaNCSS – Source code metrics
  • TagList – Listar TODO:s etc
  • FindBugs – Hittar potentiella buggar i din javakod
  • Changes – Skapar en lista över de förändringar som är gjorda baserad på det Issue Management system som används (ex JIRA)
  • ChangeLog – Skapar en change-log baserat på incheckningar i SCM

Kolla även in vilka rapporter och plugins som finns tillgängliga på Apache, SourceForge och Mojo.

Exempel
Nedanstående exempel visar hur några av de ovan nämnda rapporterna kan konfigureras in för ett multimodule projekt.

Antag följande katalogstruktur:

<br></br>
multimodule<br></br>
|-- pom.xml<br></br>
|-- project1<br></br>
| `-- pom.xml<br></br>
|-- project2<br></br>
| `-- pom.xml<br></br>

Då kan POM-filen i rot-katalogen se ut enligt nedan. Notera att xrefLocation är explicit satt för vissa av rapporterna för att få korrekta referenser mellan källkod och själva rapporten.

<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>
    <version>1.0-SNAPSHOT</version>
    <groupId>se.cygni.sample</groupId>
    <artifactId>multimodule-parent</artifactId>
    <packaging>pom</packaging>
    <name>Multimodule Parent (Cygni sample)</name>
 
    <!-- The sub-modules -->
    <modules>
        <module>project1</module>
        <module>project2</module>
    </modules>
 
    <build>
        <plugins>
            <!--
                Needed in order to handle aggregated clover reports. See
                http://maven.apache.org/plugins/maven-clover-plugin/usage.html
            -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-clover-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>pre-site</phase>
                        <goals>
                            <goal>instrument</goal>
                            <goal>aggregate</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
 
    <reporting>
        <plugins>
            <!-- JXR - Source code as HTML -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jxr-plugin</artifactId>
                <configuration>
                    <!--
                        Enable aggregation for multimodule projects.
                    -->
                    <aggregate>true</aggregate>
                </configuration>
            </plugin>
 
            <!-- JavaDoc - API-documentation -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-javadoc-plugin</artifactId>
                <configuration>
                    <!--
                        Enable aggregation for multimodule projects.
                    -->
                    <aggregate>true</aggregate>
                </configuration>
            </plugin>
 
            <!-- Surefire - JUnit testing-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-report-plugin</artifactId>
                <configuration>
                    <!-- Required to properly link JXR -->
                    <xrefLocation>
                        ${project.reporting.outputDirectory}/../xref-test
                    </xrefLocation>
                </configuration>
            </plugin>
 
            <!-- JDepend - Package dependencies -->
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>jdepend-maven-plugin</artifactId>
            </plugin>
 
            <!-- FindBugs - Finds potential bugs in your source code -->
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>findbugs-maven-plugin</artifactId>
            </plugin>
 
            <!-- JavaNCSS - Source code metrics -->
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>javancss-maven-plugin</artifactId>
            </plugin>
 
            <!-- TagList - Creates a list with TODO:s etc -->
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>taglist-maven-plugin</artifactId>
            </plugin>
 
            <!-- Clover - Code Coverage -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-clover-plugin</artifactId>
                <configuration>
                    <generateXml>true</generateXml>
               </configuration>
            </plugin>
 
            <!-- CheckStyle - Enforces coding style -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-checkstyle-plugin</artifactId>
                <configuration>
                    <enableRulesSummary>false</enableRulesSummary>
 
                    <!-- Required to properly link JXR -->
                    <xrefLocation>
                        ${project.reporting.outputDirectory}/../xref
                    </xrefLocation>
                </configuration>
            </plugin>
 
            <!--
                The dashboard plugin should be specified as
                the last report.
            -->
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>dashboard-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </reporting>
 
    <!--
        Required since dashboard has not yet reached 1.0-status.
    -->
    <pluginRepositories>
        <pluginRepository>
            <id>Codehaus Snapshots</id>
            <url>http://snapshots.repository.codehaus.org/</url>
        </pluginRepository>
    </pluginRepositories>
</project>

Nedan visas POM-filen för respektive submodul. Notera att outputDirectory är satt till site-katalogen i parent-projektet för att dashboard-pluginen ska fungera korrekt.

<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>
 
    <parent>
        <version>1.0-SNAPSHOT</version>
        <groupId>se.cygni.sample</groupId>
        <artifactId>multimodule-parent</artifactId>
    </parent>
 
    <artifactId>project1</artifactId>
    <packaging>jar</packaging>
    <name>Project 1 (Cygni sample)</name>
 
    <dependencies>
        ...
    </dependencies>
 
    <reporting>
        <!--
            Needed in order to generate the dashboard report properly
        -->
        <outputDirectory>
            ${basedir}/../target/site/${project.artifactId}
        </outputDirectory>
    </reporting>
</project>