Maven:在一个阶段运行插件两次,与另一个插件交错
对于我们的end-2-end测试,我们需要执行以下逻辑流程:
- 在数据库中创建和设置e2e模式(用户)(
pre-integration-test
) - 运行Liquibase以初始填充模式(
pre-integration-test
) - 将e2e特定的测试数据添加到数据库表(
pre-integration-test
) - 启动Tomcat(
pre-integration-test
) - 使用Protractor在Tomcat(
integration-test
)中运行Web应用程序 - 关闭Tomcat(
post-integration-test
) - 清理数据库:删除架构(
post-integration-test
)
对于运行SQL,使用sql-maven-plugin
,但是此流程不适合常规POM布局:
- SQL插件必须在
liquibase-maven-plugin
之前和之后两次pre-integration-test
期间运行 - SQL插件必须在
pre-integration-test
期间在 Tomcat插件之前运行,但是必须在post-integration-test
期间运行,以便在Tomcat关闭后删除数据库模式。
据我所知,从Maven文档中可以看出,POM中插件的顺序定义了同一阶段的执行顺序,并且插件在同一个POM中不能被提及两次。
问题 :除了编写一个多次调用Maven的shell脚本之外,有没有办法实现这个目的?
PS发现了一个类似的悬而未决的问题 。
鉴于下面的样本POM:
4.0.0 com.sample sample-project 0.0.2-SNAPSHOT maven-antrun-plugin 1.5 print-hello validate run org.codehaus.mojo exec-maven-plugin 1.5.0 exec-echo validate cmd /C echo hello-from-exec exec maven-antrun-plugin 1.5 print-hello-2 validate run
我们实际配置:
-
maven-antrun-plugin
在hello there!
打印hello there!
信息 -
exec-maven-plugin
用于打印hello-from-exec
消息 -
maven-antrun-plugin
打印hello there 2!
信息
目标执行都附加到同一阶段, validate
,我们希望以相同的定义顺序执行。
但是,在调用时( -q
选项用于精确且仅具有其输出):
mvn validate -q
我们会有输出:
main: [echo] hello there! main: [echo] hello there 2! hello-from-exec
也就是说,对于同一阶段,Maven执行已定义的插件,但是为相同的插件合并所有已定义的执行(即使定义为不同的plugin
部分),然后按顺序执行它们以合并定义。
不幸的是,没有机制可以避免这种合并 。 我们配置插件执行行为的唯一选择是:
-
inherited
配置条目:
是或否,此插件配置是否应该应用于从此inheritance的POM。 默认值为
true
。 -
combine.children
和combine.self
到
通过向配置元素的子元素添加属性来控制子POM如何从父POMinheritance配置。
这些选项都不会对我们有所帮助。 在这种情况下,我们需要在execution
元素上使用一种merge
属性,或者默认情况下具有不同的行为(也就是说,Maven应该遵循定义顺序)。
从命令行调用单个执行,如下所示:
mvn antrun:run@print-hello exec:exec@exec-echo antrun:run@print-hello-2 -q
我们会改为获得所需的输出:
main: [echo] hello there! hello-from-exec main: [echo] hello there 2!
但在这种情况下:
- 我们不依赖于任何阶段
- 我们通过命令行直接调用特定的执行(及其配置)(以及仅在Maven 3.3.1之后可用的新function)
您可以通过脚本或通过exec-maven-plugin调用maven本身来实现完全相同,但是 – 再次 – 同样适用:没有应用阶段,只有执行序列。