Maven 插件越过执行顺序
Maven plugin crossed execution order
我正在使用故障安全插件编写一些集成测试。
我要执行以下操作:
1) 开始Docker(阶段预积分测试中的目标开始)
2) 开始Spring(目标开始阶段预积分测试)
3) 测试(阶段整合测试)
4) 停止Spring(目标停止在post-集成测试)
5) 停止Docker(目标停止在post-集成测试)
为什么?我想在 Spring 之前启动 Docker 以便在 Spring 启动时所有数据库都准备就绪,而且我想在 Spring 之后停止 Docker 以避免很多错误在 Spring 由于数据库连接丢失。
我有以下 pom.xml:
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.20.1</version>
<executions>
<execution>
<id>run-docker-containers</id>
<goals>
<goal>start</goal>
</goals>
<configuration>
...
</configuration>
</execution>
<execution>
<id>stop-docker-containers</id>
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>pre-integration-test</id>
<goals>
<goal>start</goal>
</goals>
<configuration>
...
</configuration>
</execution>
<execution>
<id>post-integration-test</id>
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
但是有了这个 pom.xml 我得到了这个订单:
1) 开始Docker
2) 开始 Spring
3) 测试
4) 停止 Docker
5) 停止Spring
这是 Docker 在 Spring 之前停止,我不希望这样。
我知道Maven中的执行顺序是由pom.xml中的顺序给出的,但在这种情况下我需要交叉目标。
有什么建议吗?
谢谢。
Maven 中的执行顺序基于两个组件:
- 首先,执行绑定的lifecycle phase
- 对于绑定到同一阶段的执行,POM 中的顺序优先。
Maven 不允许同一个插件被配置两次,因此无法将 Docker 停止执行移动到 Spring 下面。我知道解决此类问题的唯一方法是在组合中引入第三阶段。将 'stop' 目标绑定到 verify
阶段看起来有点奇怪,我肯定会添加评论来解释为什么这样做是为了 posterity - 但它有效。
此插件配置执行以下操作(假设您使用 maven-failsafe-plugin
进行集成测试;如果您使用不同的插件,请遵循与该插件相同的原则)。括号中的 Maven 生命周期阶段:
1) Docker 开始(预集成测试)
2) Spring 开始(预集成测试;Spring 插件配置在 Docker 之后)
3) 执行测试(集成测试)
4) Spring 停止 (post-集成测试)
5) Docker 停止(验证)
6) 验证测试结果(验证;Docker 后的 Failsafe 插件配置)
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.20.1</version>
<executions>
<execution>
<id>run-docker-containers</id>
<phase>pre-integration-test</phase>
<goals>
<goal>start</goal>
</goals>
</execution>
<execution>
<id>stop-docker-containers</id>
<phase>verify</phase> <!-- important: note phase -->
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>${version.maven.failsafe.plugin}</version>
<executions>
<execution>
<id>failsafe-integration-tests</id>
<phase>integration-test</phase>
<goals>
<goal>integration-test</goal>
</goals>
</execution>
<execution>
<id>failsafe-verify</id>
<phase>verify</phase>
<goals>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>pre-integration-test</id>
<phase>pre-integration-test</phase>
<goals>
<goal>start</goal>
</goals>
</execution>
<execution>
<id>post-integration-test</id>
<phase>post-integration-test</phase>
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>
我正在使用故障安全插件编写一些集成测试。
我要执行以下操作:
1) 开始Docker(阶段预积分测试中的目标开始)
2) 开始Spring(目标开始阶段预积分测试)
3) 测试(阶段整合测试)
4) 停止Spring(目标停止在post-集成测试)
5) 停止Docker(目标停止在post-集成测试)
为什么?我想在 Spring 之前启动 Docker 以便在 Spring 启动时所有数据库都准备就绪,而且我想在 Spring 之后停止 Docker 以避免很多错误在 Spring 由于数据库连接丢失。
我有以下 pom.xml:
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.20.1</version>
<executions>
<execution>
<id>run-docker-containers</id>
<goals>
<goal>start</goal>
</goals>
<configuration>
...
</configuration>
</execution>
<execution>
<id>stop-docker-containers</id>
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>pre-integration-test</id>
<goals>
<goal>start</goal>
</goals>
<configuration>
...
</configuration>
</execution>
<execution>
<id>post-integration-test</id>
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
但是有了这个 pom.xml 我得到了这个订单:
1) 开始Docker
2) 开始 Spring
3) 测试
4) 停止 Docker
5) 停止Spring
这是 Docker 在 Spring 之前停止,我不希望这样。
我知道Maven中的执行顺序是由pom.xml中的顺序给出的,但在这种情况下我需要交叉目标。
有什么建议吗?
谢谢。
Maven 中的执行顺序基于两个组件:
- 首先,执行绑定的lifecycle phase
- 对于绑定到同一阶段的执行,POM 中的顺序优先。
Maven 不允许同一个插件被配置两次,因此无法将 Docker 停止执行移动到 Spring 下面。我知道解决此类问题的唯一方法是在组合中引入第三阶段。将 'stop' 目标绑定到 verify
阶段看起来有点奇怪,我肯定会添加评论来解释为什么这样做是为了 posterity - 但它有效。
此插件配置执行以下操作(假设您使用 maven-failsafe-plugin
进行集成测试;如果您使用不同的插件,请遵循与该插件相同的原则)。括号中的 Maven 生命周期阶段:
1) Docker 开始(预集成测试)
2) Spring 开始(预集成测试;Spring 插件配置在 Docker 之后)
3) 执行测试(集成测试)
4) Spring 停止 (post-集成测试)
5) Docker 停止(验证)
6) 验证测试结果(验证;Docker 后的 Failsafe 插件配置)
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.20.1</version>
<executions>
<execution>
<id>run-docker-containers</id>
<phase>pre-integration-test</phase>
<goals>
<goal>start</goal>
</goals>
</execution>
<execution>
<id>stop-docker-containers</id>
<phase>verify</phase> <!-- important: note phase -->
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>${version.maven.failsafe.plugin}</version>
<executions>
<execution>
<id>failsafe-integration-tests</id>
<phase>integration-test</phase>
<goals>
<goal>integration-test</goal>
</goals>
</execution>
<execution>
<id>failsafe-verify</id>
<phase>verify</phase>
<goals>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>pre-integration-test</id>
<phase>pre-integration-test</phase>
<goals>
<goal>start</goal>
</goals>
</execution>
<execution>
<id>post-integration-test</id>
<phase>post-integration-test</phase>
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>