Maven:将插件执行绑定到另一个插件的执行,而不是生命周期阶段

时间:2013-04-28 14:47:53

标签: maven maven-release-plugin git-flow

关于接受答案的说明:我接受了答案,因为有充分的间接证据。尽管如此,这是一个间接的证据,所以要带上一粒盐。


当用户运行插件目标而不是生命周期阶段时,如何触发插件? (此has been asked之前,但答案是使用生命周期阶段。)

例证:我需要release:branch调用regex-plugin来生成一个分支,其中当前版本为其名称,减去-SNAPSHOT后缀。这就是我所拥有的,它要求开发人员激活配置文件并调用verify阶段。我需要开发人员只需调用release:branch,这反过来应该导致regex-plugin运行。与Gitflow有点结婚。

<profile>
    <id>Release Branch</id>
    <build>
        <plugins>
            <!-- On validate, compute the current version without -SNAPSHOT. -->
            <!-- Put the result in a property. -->
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>build-helper-maven-plugin</artifactId>
                <version>1.7</version>
                <executions>
                    <execution>
                        <phase>validate</phase>
                        <goals>
                            <goal>regex-property</goal>
                        </goals>
                        <configuration>
                            <value>${project.version}</value>
                            <regex>^(.*)-SNAPSHOT$</regex>
                            <replacement>$1</replacement>
                            <name>project.unqualifiedVersion</name>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <!-- Also on validate, run the branch plugin, and use -->
            <!-- the non-SNAPSHOT version thus computed in the branch name. -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-release-plugin</artifactId>
                <version>2.3.2</version>
                <executions>
                    <execution>
                        <phase>validate</phase>
                        <goals>
                            <goal>branch</goal>
                        </goals>
                        <configuration>
                            <branchName>release/${project.unqualifiedVersion}</branchName>
                            <updateWorkingCopyVersions>true</updateWorkingCopyVersions>
                            <updateBranchVersions>false</updateBranchVersions>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</profile>

意图是release:branch将当前快照版本(例如,1.0.5-SNAPSHOT)移动到新分支中,该分支应以版本命名,但没有多余的-SNAPSHOT后缀( 1.0.5)。然后,当前分支应该采用新的快照版本(1.1.0-SNAPSHOT,而不是1.0.6-SNAPSHOT,因为我们希望版本1.0.x有空间用于修补程序,因此我们为分支保留它)(I没有计算出下一个快照版本的自动计算,因此,如果您使用validate运行上面的Maven配置,则必须在提示时输入它。

2 个答案:

答案 0 :(得分:8)

到目前为止提供的证据相当具有间接性。我已经做了一些自己的研究,所以我最好在这里分享一下。以下是更多相同的“它是不可能的”,或者是替代品的构建块。

jetspeed:mvn plugin ---运行指定的插件序列;要运行的配置可以通过系统属性来改变; IDE集成问题


Executing goals before plugin runs (StackOverflow) ---在自定义Mojo

的上下文中回答了同样的问题

Make Mojo run other goals (StackOverflow) ---再次,来自自定义Mojo

的上下文

Configuring default Mojo executions ---描述Mojos如何运行的Maven页面 - 更多间接证据


Triggering phases before goal execution (StackOverflow) ---迂回解决我的问题,遗憾的是回答了否定


有趣Guide to Ant plugin development ---吸引我,因为,虽然它需要编写自定义插件,但它是所有Ant + Maven配置,没有编译代码;可能是进入门槛较低的


Creating a parallel lifecycle ---吸引人的方法,因为我可以完全控制生命周期的内容到使用Gitflow动词的地方;不清楚IDE如何整合这个;存在学习曲线和采用障碍问题

答案 1 :(得分:5)

不,你不能将插件绑定到另一个插件。只到一个阶段。

在Maven内部术语中,“Mojo”是可行的。 “插件”是包裹的mojos集合,因此您可以从POM中引用它们。 Mojos只与阶段结合。

来自plugin development documentation

  

插件描述符中指定的每个Mojo必须提供以下内容

     

...

     

阶段 ...如果用户未在POM中明确设置阶段,则定义将mojo执行绑定到的默认阶段。注意:当插件声明添加到POM时,此批注不会自动生成mojo。它只允许用户从周围的<phase>元素中省略<execution>元素。

有关进一步确认,请参阅MojoExecution的来源(此类JavaDoc无效)并注意枚举的执行源有两种:

  

源自CLI直接调用目标的执行

  

源自绑定到生命周期阶段的目标的执行

没有其他方法可以启动执行意味着你运气不好(除非采取非常的措施,例如滚动你自己的插件,它结合了你想要链接的两个插件的效果,然后使用你的自定义插件)。