docker compose不直接参与maven多模块本地调试,但可协调各可运行模块(如spring boot、web wasm)在隔离容器中启动并互通网络,实现端到端联调;需为模块配置jvm调试端口并映射,再通过ide远程连接调试。

Compose 编排文件(docker-compose.yml)本身不直接参与 Maven 多模块项目的本地调试——它面向容器化部署,而 Maven 本地调试依赖 JVM 进程、IDE 集成和 Gradle/Maven 构建生命周期。但你可以用 Docker Compose **协调多个模块的独立运行环境**,实现“类并行调试”效果:比如让后端服务(Spring Boot 模块)、前端 Web 模块(Compose Multiplatform WASM)、共享逻辑模块(KMP common)各自在隔离容器中启动,并保持网络互通,便于端到端联调。
前提:模块需具备可独立运行能力
不是所有 Maven 子模块都适合放进容器。只有满足以下条件的模块才适配:
- 打包为可执行 JAR(如 Spring Boot 的
spring-boot-maven-plugin)或原生镜像(GraalVM) - Web 模块已构建为静态资源(如 Compose Multiplatform 的
:webApp:jsBrowserDistribution或:webApp:wasmJsBrowserDistribution) - KMP 共享模块不单独运行,但可通过 Android/iOS/Desktop 模块间接暴露 API,供其他容器调用
编写 docker-compose.yml 协调多模块服务
假设你的 Maven 多模块项目结构如下:
myapp/ ├── pom.xml ← 父 POM ├── api-server/ ← Spring Boot 模块(提供 REST API) ├── web-app/ ← Compose Multiplatform Web 模块(WASM/JS) └── mobile-app/ ← Android 模块(可选,用于验证 KMP 共享逻辑)
你只需为可运行模块编写服务定义。例如:
version: '3.8'
services:
api-server:
build: ./api-server
ports: ["8080:8080"]
environment:
- SPRING_PROFILES_ACTIVE=dev
<p>web-app:
image: nginx:alpine
ports: ["8000:80"]
volumes:</p>
- ./web-app/build/distributions/webApp-js-browser/webApp-js-browser-1.0-SNAPSHOT/:/usr/share/nginx/html:ro
depends_on: [api-server]
注意:
web-app不是 Java 进程,而是用 Nginx 托管静态 WASM/JS 资源;api-server则需在./api-server/Dockerfile中正确构建 JAR 并运行。
本地调试的关键配合动作
Docker Compose 启动的是生产态容器,要支持调试,必须额外配置:
-
开启 JVM 调试端口:在
api-server的Dockerfile中添加 JVM 参数:java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 -jar app.jar -
映射调试端口:在
docker-compose.yml的api-server服务下加:ports: ["8080:8080", "5005:5005"] - IDE 远程调试连接:在 IntelliJ IDEA 中新建 Remote JVM Debug 配置,Host=host.docker.internal(macOS/Windows)或宿主机 IP(Linux),Port=5005,即可打断点、查变量
-
Web 模块热重载不适用容器:开发阶段建议用
./gradlew :webApp:wasmJsBrowserRun在本地启动开发服务器(支持热重载),仅用 Docker Compose 模拟集成环境
为什么不能直接“调试 Maven 模块”?
Maven 是构建工具,不是运行时容器。它的 mvn compile 或 mvn install 命令只生成字节码或构件,不启动进程。所谓“多模块并行调试”,本质是:
- 在 IDE 中为不同模块分别创建 Run/Debug Configurations(如一个跑
api-server:bootRun,另一个跑desktopApp:run) - 利用 Maven 反应器机制保证依赖顺序(必须从父目录执行
mvn clean install,否则子模块找不到同项目的其他模块) - 通过统一端口规划(如 API 用 8080、Desktop UI 用 8888、Web 用 8000)避免冲突,实现人工并行观察
Compose 文件在这里是辅助角色——它帮你省去手动启停多个终端命令的麻烦,把“启动一套集成环境”的操作变成一条 docker-compose up。











