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

Lór*_*tér 62 java maven-2

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

[...]但是,这只配置在子节点的plugins元素中实际引用的插件.(POM参考)

有没有其他方法来实现这一目标

更新:我根据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>
<!-- ... -->
Run Code Online (Sandbox Code Playgroud)

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

Pas*_*ent 29

根据Default Lifecycle Bindings,包装的绑定pom是:

默认生命周期绑定 - 包装pom

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

因此,如果您的父POM有一个<packaging>pom<packaging>(这应该是注释中指出的情况),并且如果您将插件绑定到上述其他阶段(请参阅生命周期参考以获得全面的列表),则它们将不会在执行期间执行父POM的构建.

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

正如您所指出的,您可以使用pluginManagement父pom中的插件进行配置,但是如果您真的想要在子模块中而不是在父模块中执行插件目标(您可能有充分的理由这样做,但大部分时间都是如此)插件对于没有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>
Run Code Online (Sandbox Code Playgroud)

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

<project>
  ...
  <build>
    ...
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
      </plugin>
    </plugins>
    ...
  </build>
</project>
Run Code Online (Sandbox Code Playgroud)


小智 17

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

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

<profile>
    <id>generate-dc</id>
    <activation>
        <file>
            <exists>src/main/assembly/some.xml</exists>
        </file>
    </activation>
Run Code Online (Sandbox Code Playgroud)

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


小智 10

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

父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> 
Run Code Online (Sandbox Code Playgroud)

儿童项目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>
Run Code Online (Sandbox Code Playgroud)