Maven配置文件-如何为父级运行一次插件,为模块运行更多插件?
我对詹金斯的作品有点困惑 Jenkins上的作业:(底部缩短了pom.xml) 我的所有插件将运行4次:Maven配置文件-如何为父级运行一次插件,为模块运行更多插件?,maven,plugins,module,profile,Maven,Plugins,Module,Profile,我对詹金斯的作品有点困惑 Jenkins上的作业:(底部缩短了pom.xml) 我的所有插件将运行4次: parent/pom.xml 父级/module1/pom.xml 父级/module2/pom.xml 父级/module3/pom.xml 我需要: 第一个maven插件:仅在父pom.xml中运行一次 第二个maven插件:每运行一次pom.xml 原因: 第一个maven插件:将分阶段运行:初始化-->相当长的清理操作。我不想这样做4次 第二个maven插件:将在所有pom
- parent/pom.xml
- 父级/module1/pom.xml
- 父级/module2/pom.xml
- 父级/module3/pom.xml
- 第一个maven插件:仅在父pom.xml中运行一次
- 第二个maven插件:每运行一次pom.xml
- 第一个maven插件:将分阶段运行:初始化-->相当长的清理操作。我不想这样做4次
- 第二个maven插件:将在所有pom必需的阶段:包-->中运行
<project ...>
<groupId>com.test.parent</groupId>
<modelVersion>4.0.0</modelVersion>
<artifactId>parent</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<name>parent</name>
<modules>
<module>module1</module>
<module>module2</module>
<module>module3</module>
</modules>
<profiles>
<profile>
<id>profile1</id>
<build>
<plugins>
<plugin>
<groupId>com.test.plugin</groupId>
<artifactId>first-maven-plugin</artifactId>
<version>1.0.0-SNAPSHOT</version>
<execution>
<id>execution1</id>
<phase>initialize</phase>
<goals>
<goal>doit</goal>
</goals>
</execution>
</plugin>
<plugin>
<groupId>com.test.plugin2</groupId>
<artifactId>second-maven-plugin</artifactId>
<version>1.0.0-SNAPSHOT</version>
<execution>
<id>another</id>
<phase>package</phase>
<goals>
<goal>goforit</goal>
</goals>
</execution>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
com.test.parent
4.0.0
父母亲
聚甲醛
1.0-快照
父母亲
模块1
模2
模块3
简介1
插件
第一个maven插件
1.0.0-SNAPSHOT
死刑1
初始化
多伊特
com.test.plugin2
第二个maven插件
1.0.0-SNAPSHOT
另一个
包裹
推崇备至
首先,如果您在父级中定义了一个插件,该插件继承给所有子级,而不是按照您希望的方式运行,这意味着它在每个pom上执行(或者说,在每个模块上执行,无论它是否是子级)
你的插件的问题是它们处理用例的能力不是很好。因为你是说第一个第一个maven插件
应该只在根级别上运行(除此之外,我不明白你说的清理操作是什么意思…删除目标文件夹?)
第二个插件第二个maven插件应该为所有pom运行吗?哪一个不是很准确的原因?您所说的pom是指所有具有封装的子模块pom
?但我想你指的是所有有包装的孩子
除上述情况外,我不确定您的配置文件的使用是否仅仅基于缺乏正确的用例处理
根据以上结果,我认为您需要更改插件的实现
如果您希望插件仅在这种多模块结构的根级别上运行,则可以通过以下非常简单的方式处理插件:
public void execute()
抛出MojoExecutionException,MojoFailureException
{
if(mavenProject.isExecutionRoot()){
}否则{
}
..
通过使用上面的代码,你的插件可以决定它是否在根级别上运行
因此,您的第一个maven插件可以使用以下功能:
public void execute()
抛出MojoExecutionException,MojoFailureException
{
如果(!mavenProject.isExecutionRoot()){
getLog().info(“未在根级别运行”);
返回;
}
//下面是耗时的操作
..
和您的第二个maven插件
来完成oposite:
public void execute()
抛出MojoExecutionException,MojoFailureException
{
if(mavenProject.isExecutionRoot()){
getLog().info(“未在根级别运行”);
返回;
}
//这是孩子们的手术。
..
可通过以下方式改善行为:
public void execute()
抛出MojoExecutionException,MojoFailureException
{
如果(!mavenProject.isExecutionRoot()){
getLog().debug(“未在根级别运行”);
返回;
}
if(“pom”.equals(project.getPackaging())){
调试(“忽略pom打包”);
返回;
}
//…现在你想做的操作。。。
因此,如果您有多个级别的模块层次结构,您可以忽略pom
打包部件或其他部件等
最后但并非最不重要的一点。你的插件存档了什么?你可以在第一个插件配置中使用false
。因此它只会在父pom执行中运行
<build>
<plugins>
<plugin>
<groupId>com.test.plugin</groupId>
<artifactId>first-maven-plugin</artifactId>
<version>1.0.0-SNAPSHOT</version>
<inherited>false</inherited>
<execution>
<id>execution1</id>
<phase>initialize</phase>
<goals>
<goal>doit</goal>
</goals>
</execution>
</plugin>
<plugin>
<groupId>com.test.plugin2</groupId>
<artifactId>second-maven-plugin</artifactId>
<version>1.0.0-SNAPSHOT</version>
<execution>
<id>another</id>
<phase>package</phase>
<goals>
<goal>goforit</goal>
</goals>
</execution>
</plugin>
</plugins>
</build>
插件
这两个插件是否有跳过选项?这些插件没有跳过选项。它们是通用的,因为它们可以在多个项目上运行。为什么这不是批准的答案?
<build>
<plugins>
<plugin>
<groupId>com.test.plugin</groupId>
<artifactId>first-maven-plugin</artifactId>
<version>1.0.0-SNAPSHOT</version>
<inherited>false</inherited>
<execution>
<id>execution1</id>
<phase>initialize</phase>
<goals>
<goal>doit</goal>
</goals>
</execution>
</plugin>
<plugin>
<groupId>com.test.plugin2</groupId>
<artifactId>second-maven-plugin</artifactId>
<version>1.0.0-SNAPSHOT</version>
<execution>
<id>another</id>
<phase>package</phase>
<goals>
<goal>goforit</goal>
</goals>
</execution>
</plugin>
</plugins>
</build>