在多模块项目中,如何指定要在所有子模块中执行插件目标,而不是在父项目中执行?有<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)
归档时间: |
|
查看次数: |
50879 次 |
最近记录: |