Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Maven配置文件-如何为父级运行一次插件,为模块运行更多插件?_Maven_Plugins_Module_Profile - Fatal编程技术网

Maven配置文件-如何为父级运行一次插件,为模块运行更多插件?

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

我对詹金斯的作品有点困惑

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必需的阶段:包-->中运行
父pom.xml

<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>