You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Maven启动多个Spring Boot应用开展微服务链测试?

嘿,这个场景我在团队做微服务集成测试时碰到过好几次,咱们来一步步解决你的问题:

能不能通过spring-boot-maven-plugin启动/停止其他子模块的Spring Boot jar?

完全可以,但你得调整插件的配置逻辑——默认情况下spring-boot-maven-plugin只会作用于当前模块,所以需要在集成测试模块的pom.xml中,为每个微服务子模块单独配置插件执行单元(execution),明确指定子模块的路径和启动入口。

给你一个可直接复用的配置示例:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <executions>
        <!-- 启动微服务A -->
        <execution>
            <id>start-ms-a</id>
            <phase>pre-integration-test</phase>
            <goals>
                <goal>start</goal>
            </goals>
            <configuration>
                <mainClass>com.example.msa.MicroserviceAApplication</mainClass>
                <arguments>
                    <argument>--server.port=8081</argument>
                </arguments>
                <!-- 指定子模块的根目录 -->
                <workingDirectory>../microservice A</workingDirectory>
                <!-- 直接用编译后的class文件启动,无需提前打包jar -->
                <classesDirectory>../microservice A/target/classes</classesDirectory>
            </configuration>
        </execution>
        <!-- 启动微服务B -->
        <execution>
            <id>start-ms-b</id>
            <phase>pre-integration-test</phase>
            <goals>
                <goal>start</goal>
            </goals>
            <configuration>
                <mainClass>com.example.msb.MicroserviceBApplication</mainClass>
                <arguments>
                    <argument>--server.port=8082</argument>
                </arguments>
                <workingDirectory>../microservice B</workingDirectory>
                <classesDirectory>../microservice B/target/classes</classesDirectory>
            </configuration>
        </execution>
        <!-- 统一停止所有微服务 -->
        <execution>
            <id>stop-ms-all</id>
            <phase>post-integration-test</phase>
            <goals>
                <goal>stop</goal>
            </goals>
        </execution>
    </executions>
</plugin>

这里有几个关键细节要注意:

  • 每个execution必须有唯一的id,避免maven执行时冲突
  • 如果想启动打包好的jar文件,把classesDirectory替换为<jar>../microservice A/target/microservice-a-1.0.0.jar</jar>即可
  • 一定要确保在pre-integration-test阶段前,子模块已经完成编译/打包——最简单的方式是在集成测试模块的pom中添加对所有微服务子模块的依赖,或者额外配置maven-invoker-plugin先触发子模块的package生命周期
有没有其他方法在pre-integration-test阶段启动多个组件?

当然有,这里推荐几个在实际项目中验证过的实用方案:

1. Testcontainers(最推荐)

Testcontainers可以把每个微服务打包成Docker镜像,然后在隔离的容器中启动,完全避免本地环境的端口冲突、依赖不一致问题,而且测试环境可重复、可迁移。

你可以直接在maven中配置Testcontainers插件,在pre-integration-test阶段启动容器:

<plugin>
    <groupId>org.testcontainers</groupId>
    <artifactId>testcontainers-maven-plugin</artifactId>
    <version>1.19.3</version>
    <executions>
        <execution>
            <id>start-containers</id>
            <phase>pre-integration-test</phase>
            <goals>
                <goal>start</goal>
            </goals>
        </execution>
        <execution>
            <id>stop-containers</id>
            <phase>post-integration-test</phase>
            <goals>
                <goal>stop</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <containers>
            <container>
                <image>your-team-registry/microservice-a:latest</image>
                <ports>
                    <port>8081:8080</port>
                </ports>
                <env>
                    <SPRING_PROFILES_ACTIVE>test</SPRING_PROFILES_ACTIVE>
                </env>
            </container>
            <container>
                <image>your-team-registry/microservice-b:latest</image>
                <ports>
                    <port>8082:8080</port>
                </ports>
                <env>
                    <SPRING_PROFILES_ACTIVE>test</SPRING_PROFILES_ACTIVE>
                </env>
            </container>
        </containers>
    </configuration>
</plugin>

2. 使用maven-invoker-plugin触发子模块的启动

如果每个微服务的spring-boot插件配置是独立维护的,可以用maven-invoker-plugin在集成测试模块中调用子模块的spring-boot:start命令,这样每个子模块的启动逻辑可以单独调整:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-invoker-plugin</artifactId>
    <version>3.5.0</version>
    <executions>
        <execution>
            <id>start-ms-a</id>
            <phase>pre-integration-test</phase>
            <goals>
                <goal>run</goal>
            </goals>
            <configuration>
                <pomFile>../microservice A/pom.xml</pomFile>
                <goals>
                    <goal>spring-boot:start</goal>
                </goals>
            </configuration>
        </execution>
        <execution>
            <id>start-ms-b</id>
            <phase>pre-integration-test</phase>
            <goals>
                <goal>run</goal>
            </goals>
            <configuration>
                <pomFile>../microservice B/pom.xml</pomFile>
                <goals>
                    <goal>spring-boot:start</goal>
                </goals>
            </configuration>
        </execution>
        <!-- 停止服务的配置类似,调用spring-boot:stop即可 -->
    </executions>
</plugin>

3. 自定义启动/停止脚本

如果你的项目环境比较固定,也可以写Shell(Linux/Mac)或Batch(Windows)脚本,在脚本中依次启动每个微服务的jar包(用nohup java -jar ... &后台启动,并记录PID到文件),然后用exec-maven-plugin在maven生命周期中调用脚本:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>3.1.0</version>
    <executions>
        <execution>
            <id>start-services</id>
            <phase>pre-integration-test</phase>
            <goals>
                <goal>exec</goal>
            </goals>
            <configuration>
                <executable>bash</executable>
                <arguments>
                    <argument>../start-services.sh</argument>
                </arguments>
            </configuration>
        </execution>
        <execution>
            <id>stop-services</id>
            <phase>post-integration-test</phase>
            <goals>
                <goal>exec</goal>
            </goals>
            <configuration>
                <executable>bash</executable>
                <arguments>
                    <argument>../stop-services.sh</argument>
                </arguments>
            </configuration>
        </execution>
    </executions>
</plugin>

内容的提问来源于stack exchange,提问作者Marc Enschede

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:52:55