在子模块上执行Maven插件目标,但不在父模块上执行

时间:2009-10-26 15:31:05

标签: java maven-2

在多模块项目中,如何指定要在所有子模块中执行插件目标,而不是在父项目中执行?有<pluginManagement>,但只定义了执行的配置 - 子模块仍然需要引用插件来执行目标:

  

[...]但是,这只配置了子节点中plugins元素中实际引用的插件。 POM Reference

实现这一目标的其他任何方式?

更新:我根据Pascal的建议尝试了这个:

<!-- ... -->
<packaging>pom</packaging>
<modules>
  <module>child</module>
</modules>

<build>
  <plugins>
    <plugin>
      <artifactId>maven-jar-plugin</artifactId>
      <executions>
        <execution>
        <phase>integration-test</phase>
        <goals>
          <goal>jar</goal>
        </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
<!-- ... -->

即使jar目标绑定到integration-test阶段,这仍会为父项目生成.jar。

6 个答案:

答案 0 :(得分:26)

<击> 根据{{​​3}},包装pom的绑定是:

  

默认生命周期绑定 - 打包   POM

package       site:attach-descriptor  
install       install:install  
deploy        deploy:deploy

因此,如果您的父POM有<packaging>pom<packaging>(这应该是评论中指出的情况),并且您将插件绑定到上述其他阶段(请参阅对于全面的列表,Default Lifecycle Bindings,它们将不会在父POM的构建期间执行。

(编辑:我的初步答案是错误的。如果你将插件目标绑定到特定阶段,它将在该阶段触发,无论项目的包装如何。Lifecycle Reference没有与此有关,它们只是默认的生命周期绑定。所有重要的是,插件绑定的阶段是Default Lifecycle Bindings的一部分。)

正如您所指出的,您可以使用父pom中的build lifecyle来配置插件,但是如果您真的想要在子模块中执行插件目标而在不是中执行父母(你可能有充分的理由这样做但是大多数时候,插件对于没有任何内容的pom包装的模块没有多少效果),你必须引用插件在孩子们的plugins元素中。

应用于您的示例,父pom.xml可以定义以下规范:

<project>
  <packaging>pom</packaging>
  ...
  <modules>
    <module>child</module>
  </modules>
  ...
  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-jar-plugin</artifactId>
          <version>2.2</version>
          <executions>
            <execution>
              <id>my-execution-id</id>
              <phase>integration-test</phase>
              <goals>
                <goal>jar</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
        ...
      </plugins>
    </pluginManagement>
  </build>
  ...
</project>

在每个孩子pom.xml中,只需要以下内容:

<project>
  ...
  <build>
    ...
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
      </plugin>
    </plugins>
    ...
  </build>
</project>

答案 1 :(得分:17)

所描述的插件管理解决方案当然是正确的,但在某些情况下它不适合。假设您想在子模块中运行几个jar:jar目标,每个目标都按照自己的设置(配置)执行。或者通常,当您不想强制子poms明确触发插件时。

在这种情况下,对我有用的解决方案是在特定配置文件下定义父pom中的执行,并仅在子poms中激活它,例如通过检查是否存在某个文件或属性:

<profile>
    <id>generate-dc</id>
    <activation>
        <file>
            <exists>src/main/assembly/some.xml</exists>
        </file>
    </activation>

然后插件不会在父节点中执行,但如果包含该文件,则会在所有子节点中执行,或者设置一些属性。

答案 2 :(得分:9)

我有一个类似的要求在孩子中运行一些插件但不是父POM。我通过在父POM中声明<skip>true</skip>来实现这一点。

父pom条目如下:

<plugin>
    <groupId>eviware</groupId>
    <artifactId>maven-soapui-plugin</artifactId>
    <version>4.0.0</version>
    <inherited>false</inherited>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8.2</version>
        </dependency>
    </dependencies> 
    <configuration>
        <skip>true</skip>
    </configuration>
</plugin> 

子项目pom条目位于

之下
<plugins>
    <plugin>
        <groupId>eviware</groupId>
        <artifactId>maven-soapui-plugin</artifactId>
        <version>4.0.0</version>
        <configuration>
            <settingsFile>site-service-web/src/test/soapui/soapui-settings.xml</settingsFile>
            <projectFile>site-service-web/src/test/soapui/PodifiSite-soapui-project.xml</projectFile>
            <outputFolder>site-service-web/target/surefire-reports</outputFolder>
            <junitReport>true</junitReport>
            <exportwAll>true</exportwAll>
            <printReport>true</printReport>
        </configuration>
    </plugin>
</plugins>

答案 3 :(得分:1)

在父项目的插件部分下使用<inherited>false</inherited>

请参阅this page以获取更多信息。

答案 4 :(得分:1)

以下配置对我有用。在父pom和子pom中添加插件。

家长:

<build>
  <plugins>
    <plugin>
      <artifactId>maven-jar-plugin</artifactId>
      <inherited>true</inherited>
      <executions>
        <execution>
        <phase>integration-test</phase>
        <goals>
          <goal>jar</goal>
        </goals>
        </execution>
      </executions>
      <configuration>
         <skip>true</skip>
      </configuration>
    </plugin>
  </plugins>
</build>

儿童

<build>
  <plugins>
    <plugin>
      <artifactId>maven-jar-plugin</artifactId>
      <inherited>false</inherited>
      <executions>
        <execution>
        <phase>integration-test</phase>
        <goals>
          <goal>jar</goal>
        </goals>
        </execution>
      </executions>
      <configuration>
         <skip>false</skip>
      </configuration>
    </plugin>
  </plugins>
</build>

答案 5 :(得分:0)

我尝试了Pascal的答案,但它对我不起作用。子pom中引用的插件没有执行,我假设是因为它们没有构建阶段绑定。

这里的帖子描述了一个解决方案,它通过将插件绑定到执行ID和构建阶段来工作:How to override default binding to phase of a Maven plugin

我建议其他任何人试图让这个工作。