2009-01-30 91 views

回答

10

我猜你要配置的插件,在父POM ,但只能在繼承的項目中使用它。 Maven爲此提供了一個小節 - 在pluginManagement中配置插件,但在需要時將它們綁定到一個階段,例如,省略pluginManagement中的階段標籤,但在您繼承的pom下指定它。

+1

這比Rich Steller的回答更好嗎(http://stackoverflow.com/questions/495314/automatically-activate-parent-plugin-in-maven/1209728#1209728)?這種方法比使用pluginManagement部分有什麼好處? – 2011-03-23 01:42:11

1

據我所知,沒有通用的解決方案。至少目前...

一個想法(我沒有嘗試過,但它可能工作)是在父pom.xml中定義一個不存在的執行目標,例如:

<executions> 
    <execution> 
     <goals> 
      <goal>noGoal</goal> 
     </goals> 
    </execution> 
</executions> 

並在每個孩子,你重新定義一個正確的目標。

這個解決方案的問題(如果它工作,當然;))是你必須重新定義每個孩子的插件配置。否則,它不會被執行。

+0

是的,我想過類似的東西,但你說的這個辦法的縮減是,我有在每個我不想做的孩子中進行配置。 – kukudas 2009-01-30 12:44:56

4

你可以在頂層pom聲明一個插件並告訴它被跳過,然後告訴它不要在子級跳過。它不是很自動的,但在覆蓋詳細程度上非常小。

父POM,禁用插件,但宣佈所有的配置:

<plugin> 
    <groupid>org.apache.maven.plugins</groupid> 
    <artifactid>maven-surefire-plugin</artifactid> 
    <configuration> 
     <skip>true</skip> 
     ...lots more config... 
     ...lots more config... 
     ...lots more config... 
    </configuration> 
</plugin> 

兒童POM,使插件:

<plugin> 
    <groupid>org.apache.maven.plugins</groupid> 
    <artifactid>maven-surefire-plugin</artifactid> 
    <configuration> 
     <skip>false</skip> 
    </configuration> 
</plugin> 
+1

不幸的是,這隻有在各個插件提供「skip」作爲配置時纔有效。 不是所有的插件都可以! – jbandi 2009-08-18 09:27:06

6

這不完全是你所追求的,但我認爲它對你來說足夠好。

如果您在父級的pluginManagement標記中聲明插件,則配置將由聲明該插件的任何子項目繼承。

例如,在父級聲明編譯插件使用Java 5進行測試編譯。

<pluginManagement> 
    <plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-compiler-plugin</artifactId> 
     <executions> 
     <execution> 
      <id>test-compile</id> 
      <goals> 
      <goal>testCompile</goal> 
      </goals> 
      <configuration> 
      <source>1.5</source> 
      <target>1.5</target> 
      </configuration> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
</pluginManagement> 

然後在一個孩子,你簡單的聲明編譯器插件,並從父配置將被繼承:

<build> 
    <plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-compiler-plugin</artifactId> 
    </plugin> 
    </plugins> 
</build> 
9

所以「siddhadev」是完全正確的。您可以通過給定id定義父POM的插件配置:

<build> 
    <pluginManagement> 
     <plugins> 
      <plugin> 
       <artifactId>maven-antrun-plugin</artifactId> 
       <executions> 
        <execution> 
         <id>child-caller</id> 
         <!-- 'phase' omitted --> 
         <goals> 
          <goal>run</goal> 
         </goals> 
         <configuration> 
          <tasks> 
           <echo message="called from child!" /> 
          </tasks> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </pluginManagement> 
</build> 

而且,在孩子POM,你可以明確地列出其中這應該被稱爲相:

<build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-antrun-plugin</artifactId> 
      <executions> 
       <execution> 
        <id>child-caller</id> 
        <phase>compile</phase> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

我已經用它來定位各種JRE。不幸的是,因爲你不能使用具有不同目標目錄的maven-compiler-plugin(我認爲這是插件中的一個bug),所以你必須使用Ant。

4

我去了以下解決方案:

  • 配置在pluginManagement節的家長聚甲醛插件。將插件綁定到現有階段。

  • 通過將其結合到一個不存在的階段停用父,聚甲醛插件:在插件截面重寫相。

  • 通過在插件部分插件激活每個孩子-POM的插件。

例父-POM:

<defaultGoal>install</defaultGoal> 
    <pluginManagement> 
     <plugins> 
      ... 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-install-plugin</artifactId> 
       <executions> 
        <execution> 
         <id>install-ejb-client</id> 
         <phase>install</phase> 
         <goals> 
         <goal>install-file</goal> 
         </goals> 
         <configuration> 
          <file>${ejb-client-file}</file> 
          <groupId>${project.groupId}</groupId> 
          <artifactId>${project.artifactId}</artifactId> 
          <version>${project.version}</version> 
          <packaging>jar</packaging> 
          <classifier>client</classifier> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
        ...     
     </plugins> 
    </pluginManagement> 
    <plugins> 
      <plugin> 
       <!-- deactivate the plugin for this project, only child-projects do generate ejb-clients --> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-install-plugin</artifactId> 
       <inherited>false</inherited> 
       <executions> 
        <execution> 
         <id>install-ejb-client</id> 
         <phase>none</phase> 
        </execution> 
       </executions> 
      </plugin> 
      ... 
    </plugins> 
</build> 

例兒童-POM:

<build> 
    <plugins> 
      ... 
     <plugin> 
      <!-- Install the generated client-jar. Property 'ejb-client-file' has to be set! Plugin configuration is in the parent pom --> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-install-plugin</artifactId> 
     </plugin>  
      ... 
    </plugins> 
</build>