背景说明
在实际项目开发中,代码完成并不等同于可以上线。尤其是 Java Web 项目,往往涉及多模块 Maven 工程、WebApp 主模块、Docker 镜像封装以及离线或内网服务器部署。
常见问题包括:
- IDEA 中代码修改后,Docker 容器内运行的仍是旧代码
- Maven 打包生成的 JAR 包路径不明确
- Docker build 过程中基础镜像拉取失败
- 服务器更新代码时操作繁琐
本文以 PowerGrid 项目为例,介绍如何将最新 Java Web 代码稳定、可控地打包成 Docker 镜像,并部署到服务器运行。
项目整体结构说明
在开始之前,需明确关键目录结构(以 PowerGrid 项目为例):
com.powergrid
├── powergrid-admin # Web 主程序(真正运行的模块)
├── powergrid-common # 公共模块
├── powergrid-framework # 框架模块
└── ...
└── powergrid-docker
├── webapp
│ ├── Dockerfile
│ └── powergrid-admin.jar # Docker 实际使用的 JAR
└── exported_images
└── powergrid-docker-webapp.tar
核心逻辑:Maven 在 powergrid-admin/target 产出 JAR,Docker 构建依赖 powergrid-docker/webapp 中的 JAR。中间步骤涉及文件的搬运与覆盖。
第一阶段:使用 IDEA + Maven 正确打包项目
为什么一定要用 Maven Lifecycle?
项目为多模块 Maven 工程,若仅对单个模块打包,可能导致依赖缺失或版本不一致。正确做法是从根模块统一打包。
IDEA 中的具体操作步骤
- 打开 Maven 面板:在 IDEA 右侧点击 Maven 面板。
- 执行 clean:双击
Lifecycle → clean,清空历史编译产物,避免旧代码污染新包。 - 执行 package:clean 完成后,双击
Lifecycle → package。若担心测试失败,可点击 ⚡ Skip Tests。 - 确认打包成功:控制台显示
[INFO] BUILD SUCCESS且所有模块均为 SUCCESS。
第二阶段:找到真正要用的 JAR 包
JAR 位置
Maven 打包完成后,真正要运行的 JAR 位于:
powergrid-admin/target/
通常命名为 powergrid-admin.jar。
为什么是 admin 模块?
admin 是 Spring Boot 启动模块,其他模块仅为被依赖项。Docker 运行的是该模块的 JAR。
第三阶段:覆盖 Docker 使用的 JAR
Docker 只认一个名字
查看 webapp/Dockerfile,通常会看到类似配置:
COPY powergrid-admin.jar /app/app.jar
这意味着 Docker 构建时只会查找名为 powergrid-admin.jar 的文件。

