2009-01-30 77 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>