2011-10-17 43 views
36

我有一個maven多模塊項目(男孩,我寫了這個開放方式太多次在這個網站上)。幾乎所有的模塊(即其中包含代碼)的模塊都應運行maven-site-plugin以生成有關代碼覆蓋率的報告等。這些模塊具有詳細的共享配置 - 要運行的報告,哪些文件以覆蓋/排除某些插件等。在Maven多模塊項目中,如何禁用一個孩子的插件?

但是,有幾個模塊可以處理打包 - 運行程序集插件來生成tarball等。這些從運行網站報告中獲益匪淺 - 沒有代碼分析,沒有測試報告。

所以我有很多需要份額插件配置模塊,以及需要無法運行該插件幾個模塊的,最好的。如果我將插件放在父POM的<build>部分中,我可以執行前者(共享配置),但在這種情況下,當我需要時我似乎無法關閉插件。如果我將配置向下推送到每個模塊自己的POM,我可以做後者(避免運行插件),但在這種情況下,我找不到一個分享配置信息的好方法。

是我想要的 - 共享配置,對於有時被子模塊禁用的插件 - 甚至可能嗎?如果是這樣,怎麼樣?

回答

61

通過「運行插件」,我假設您的意思是插件被綁定到生命週期階段,並且您想要在某些模塊中解除綁定。首先,您可以考慮更改您的POM繼承,以便不需要插件的模塊具有一個父代,而那些具有不同父代的模塊。如果你不想這樣做,那麼你可以明確地將執行階段設置爲子模塊中的「無」。例如。如果你有一個父POM的配置是這樣的:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>exec-maven-plugin</artifactId> 
    <version>1.2.1</version> 
    <executions> 
     <execution> 
      <id>i-do-something</id> 
      <phase>initialize</phase> 
      <goals> 
       <goal>exec</goal> 
      </goals> 
      <configuration> 
       ... lots of configuration 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

然後小孩模塊中,你可以這樣做:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>exec-maven-plugin</artifactId> 
    <version>1.2.1</version> 
    <executions> 
     <execution> 
      <id>i-do-something</id> 
      <phase/> 
     </execution> 
    </executions> 
</plugin> 

因爲這是相同的插件和相同的執行ID,它會覆蓋配置在父項中指定,現在插件未綁定到子項目中的階段。

+1

太棒了,我知道它會是這樣的,但我仍然是一個黃帶(如果你沒有從我最近的歷史中的Maven問題的蹤跡中猜到)。我無法將項目移動到不同的父母,因爲[this](http://stackoverflow.com/questions/7589931/how-should-i-share-maven-depdendencymanagement-from-multiple-sources),但我會取消綁定報告插件。謝謝! – Coderer

+4

如果沒有爲父模塊中的插件指定'',則此方法不起作用。 – EvgeniySharapov

+5

@evgeniysharapov在這種情況下,您仍然可以在子模塊中使用'',請參閱[本答案](http://stackoverflow.com/a/14653088/1155724)。 –

1

如果您希望在父pom中抑制的執行被標記爲id,則Ryan Stewart的答案有效。但是,如果父pom不用id標記執行(當然,您不能編輯該父pom),那麼我發現執行以下操作會抑制父pom的操作。

  1. 首先設置執行到none
  2. 階段創建另一個執行,給它一個id和做它,你需要它做什麼。
  3. 運行mvn help:effective-pom以確認它已正確地抑制了您需要從父pom中抑制的內容。

下面是一個例子: 這是我的父POM怎麼看起來像:

<plugin> 
     <artifactId>maven-source-plugin</artifactId> 
     <version>2.1.2</version> 
     <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
      <goal>jar</goal> 
      </goals> 
     </execution> 
     </executions> 
     <inherited>true</inherited> 
    </plugin> 

我需要的目標更改爲jar-no-fork。請注意,父pom中的執行沒有id,我可以用它來禁用它。因此,這裏就是添加到我的孩子POM:

  <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-source-plugin</artifactId> 
       <executions> 
        <execution> 
         <phase>none</phase> 
        </execution> 
        <execution> 
         <id>attach-sources</id> 
         <goals> 
          <goal>jar-no-fork</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 

因此,這是有效的,聚甲醛的樣子:

 <plugin> 
     <artifactId>maven-source-plugin</artifactId> 
     <version>2.2.1</version> 
     <executions> 
      <execution> 
      <phase>none</phase> 
      <goals> 
       <goal>jar</goal> 
      </goals> 
      <configuration> 
       <archive> 
       <compress>false</compress> 
       </archive> 
      </configuration> 
      </execution> 
      <execution> 
      <id>attach-sources</id> 
      <goals> 
       <goal>jar-no-fork</goal> 
      </goals> 
      <configuration> 
       <archive> 
       <compress>false</compress> 
       </archive> 
      </configuration> 
      </execution> 
     </executions> 
     <inherited>true</inherited> 
     <configuration> 
      <archive> 
      <compress>false</compress> 
      </archive> 
     </configuration> 
     </plugin> 

這確保了目標jar從來沒有運行,只有目標jar-no-fork執行 - 這是我想要達到的。

相關問題