2014-02-05 76 views
7

我正在嘗試使用子模塊來測試項目並正確生成報告,但遇到了一些問題。多個模塊項目的Maven報告和網站生成

我有以下項目結構:

parent 
    |-test1 
    |-test2 

parent pom.xml中看起來是這樣的:

<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> 

而且我用mvn clean install site構建項目,運行測試並生成一個網站(使用maven網站插件,反過來使用maven surefire報告插件,生成測試報告)。

麻煩的是父pom.xml中與各個階段的執行(清潔,安裝和現場)執行前的子模塊的pom.xml,因此從test1test2沒有測試報告聚集在parent

那麼有沒有辦法在一行中執行mvn clean install site,或者我絕對必須先執行mvn clean install然後再執行mvn site

感謝您的任何建議。

回答

16

顯示的配置使用相同的POM作爲父級和聚合器。文檔還將討論繼承與多模塊。父級POM將值傳遞給子級,而聚合POM管理一組子級項目或模塊。 Sonatype Maven Book的第3.6.2節詳細介紹了更多細節。

根據我的經驗,當父母和聚合POM分別爲單獨時,Maven更好地構建工作。

原因與依賴關係有關,Maven如何確定構建順序以及Maven如何運行命令。如果您的樣本結構是這樣的,有一個單獨的家長和聚合,其中TEST1和TEST2從父繼承:

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

然後Maven構建順序看起來像這樣(假設依賴定義正確的路線):

  • TEST1
  • TEST2
  • 聚合

mvn clean install site這樣的命令將從父項目開始,清理和構建,安裝到本地工件存儲庫,然後生成項目站點。它重複這個命令序列,以便顯示每個項目。因爲聚合器是分開的,所以它可以有單獨的配置來執行測試,覆蓋和javadoc的報告聚合。聚合器最後運行,所以模塊的覆蓋數據庫和中間javadoc文件已經存在,隨時可以適當組合。

當家長和聚合器是一樣的POM,你擁有它,生成順序是:

  • parentAggregator
  • test1的
  • test2的

現在,當您運行mvn clean install site, Maven必須構建父POM(這裏是parentAggregator),因此它具有子模塊所需的信息,具體取決於它。 parentAggregator也是聚合器,所以Maven會愉快地運行任何彙總報告作爲site的一部分。當然,子模塊尚未構建,所以沒有覆蓋數據庫或中間javadoc文件進行聚合。或者,可能更糟的是,存在舊文件,所以聚合器對這些文件進行操作。父集合器生成後,子模塊將生成,然後該命令退出。在構建結束時沒有最後的聚合步驟。整體結果可能不是你想要的。

這種現象可能會在多模塊項目發佈版本中造成問題,令人痛苦的是開發人員寫了一個versions-maven-plugin mojo來幫助糾正它們。問題:

如果您有一個多模塊構建,其中包含pom和模塊部分的聚合器也是其子模塊引用的父級,並且聚合器版本不包含匹配子模塊的父節中指定的版本,Maven不會讓您構建項目。

+1

感謝您對聚合器的建議,這是一個很好的解決方案。而且你也正確地預測到「舊文件存在,所以聚合器對這些文件進行操作」:) – stackoverflower