Maven插件交叉执行顺序

Maven插件交叉执行顺序,maven,maven-3,maven-plugin,maven-failsafe-plugin,maven-docker-plugin,Maven,Maven 3,Maven Plugin,Maven Failsafe Plugin,Maven Docker Plugin,我正在使用故障保护插件编写一些集成测试 我要执行以下操作: 1) 启动Docker(目标启动阶段预集成测试) 2) 启动弹簧(目标启动阶段预集成测试) 3) 测试(相位积分测试) 4) 停止弹簧(集成后测试中的目标停止) 5) 停止Docker(集成后测试中的目标停止) 为什么??我想在Spring之前启动Docker,这样当Spring启动时所有数据库都准备好了,而且我想在Spring之后停止Docker,以避免Spring中由于数据库连接丢失而出现大量错误 我有以下pom.xml文件:

我正在使用故障保护插件编写一些集成测试

我要执行以下操作:

1) 启动Docker(目标启动阶段预集成测试)

2) 启动弹簧(目标启动阶段预集成测试)

3) 测试(相位积分测试)

4) 停止弹簧(集成后测试中的目标停止)

5) 停止Docker(集成后测试中的目标停止)

为什么??我想在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>

io.fabric8
docker maven插件
0.20.1
运行docker容器
开始
...
停止装卸集装箱
停止
org.springframework.boot
springbootmaven插件
预集成测试
开始
...
整合后测试
停止
但是有了这个pom.xml,我得到了以下命令:

1) 启动码头工人

2) 发条

3) 测验

4) 停车码头工人

5) 停止弹簧

这是说,Docker在春天之前就停止了,我不想这样

我知道Maven中的执行顺序是由pom.xml中的顺序给出的,但在本例中,我需要跨越目标

有什么建议吗


谢谢。

Maven中的执行顺序基于两个组件:

  • 首先,执行绑定到的对象
  • 对于绑定到同一阶段的执行,POM中的顺序优先
Maven不允许同一个插件配置两次,因此不可能将Docker Stop执行移到Spring下面。我所知道的解决这类问题的唯一方法是在混合中引入第三阶段。将“停止”目标绑定到
verify
阶段看起来有点奇怪,我肯定会添加注释来解释为什么这样做是为了子孙后代,但它是有效的

此插件配置执行以下操作(假设您使用
maven failsafe插件进行集成测试;如果您使用不同的插件,请遵循与该插件相同的原则)。括号中的Maven生命周期阶段:

1) Docker启动(预集成测试)

2) Spring启动(预集成测试;Docker之后的Spring插件配置)

3) 执行测试(集成测试)

4) 弹簧挡块(集成后测试)

5) Docker停止(验证)

6) 验证测试结果(验证;Docker后的故障保护插件配置)


io.fabric8
docker maven插件
0.20.1
运行docker容器
预集成测试
开始
停止装卸集装箱
验证
停止
org.apache.maven.plugins
maven故障保护插件
${version.maven.failsafe.plugin}
故障安全集成测试
集成测试
集成测试
故障保护验证
验证
验证
org.springframework.boot
springbootmaven插件
预集成测试
预集成测试
开始
整合后测试
整合后测试
停止

我认为此解决方案存在问题。如果Spring未能启动,那么验证阶段将永远不会执行,Docker也不会关闭(集成后测试的情况不同,总是在成功与否之后执行集成测试)@italktothewind-如果Spring在集成前测试期间未能启动,则我相信构建将就此停止;既不运行集成测试,也不运行集成后测试。因此,所写的问题已经提到了这个问题。也许我错了,但文档中说:“故障保护插件在集成测试阶段不会使构建失败,从而使集成后测试阶段能够执行”@italktothewind-Right,integration test phase。不是集成前测试阶段。如果Spring在集成前测试阶段启动失败,我不知道集成后测试阶段是否仍在运行。Maven文档以前未完全清楚。:)这可能是一个进行实验的好地方。
<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>