Maven插件违反了执行顺序

时间:2019-04-25 18:57:14

标签: maven maven-3 maven-plugin maven-failsafe-plugin maven-docker-plugin

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

我要执行以下操作:

1)启动Docker(目标是在集成测试前阶段启动)

2)启动Spring(阶段预集成测试中的目标启动)

3)测试(相位集成测试)

4)Stop Spring(集成测试后的目标停止)

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>

但是有了这个pom.xml,我得到了以下命令:

1)启动Docker

2)启动Spring

3)测试

4)停止Docker

5)停止弹簧

这是,Docker在Spring之前已停止,我不希望这样做。

我知道Maven中的执行顺序由pom.xml中的顺序给出,但是在这种情况下,我需要越过目标。

有什么建议吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

Maven中的执行顺序基于两个组成部分:

  • 首先,执行绑定到的lifecycle phase
  • 对于绑定到同一阶段的执行,POM中的顺序优先。

Maven不允许对同一插件进行两次配置,因此无法将Docker Stop执行移至Spring以下。我知道解决此类问题的唯一方法是将第三阶段引入混合。将“停止”目标绑定到verify阶段看起来有点怪异,我肯定会添加注释来解释为什么这样做是为了后代-但这确实可行。

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

1)Docker Start(集成前测试)

2)Spring Start(预集成测试;在Docker之后配置Spring插件)

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

4)Spring Stop(集成测试后)

5)Docker停止(验证)

6)验证测试结果(验证;在Docker之后配置故障安全插件)

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