背景说明
在实际项目开发中,代码完成并不等同于可以上线。尤其是 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 的文件。
正确覆盖步骤
- 复制新生成的 JAR:
powergrid-admin/target/powergrid-admin-3.8.9.jar - 粘贴到 Docker 目录:
powergrid-docker/webapp/ - 删除旧文件
- 重命名为:
powergrid-admin.jar
常见错误包括未改名、放错目录或覆盖失败,这会导致 Docker 运行旧代码。
第四阶段:Docker 构建镜像
进入 webapp 目录(Windows 示例):
cd D:\com.powergrid\java\powergrid-docker\webapp\
docker build -t powergrid-docker-webapp .
Docker 构建失败处理:openjdk:8-jdk 拉不下来怎么办?
问题本质
本地没有 openjdk:8-jdk 镜像,或镜像源返回 403 错误,而 Dockerfile 强依赖该基础镜像。
解决思路:移花接木
- 加载旧镜像:
docker load -i ..\exported_images\powergrid-docker-webapp.tar
- 查看镜像:
docker images
- 改名伪装:
docker tag powergrid-docker-webapp:latest openjdk:8-jdk
- 重新 build:
docker build -t powergrid-docker-webapp .
此时 Dockerfile 会认为已找到基础镜像。
第五阶段:服务器部署
传输镜像
将新的 powergrid-docker-webapp.tar 上传至服务器。
加载镜像
docker load -i exported_images/powergrid-docker-webapp.tar
重启服务
docker compose up -d
查看日志
docker logs -f --tail=100 powergrid-docker-webapp
完整流程总结
IDEA → Maven clean → Maven package → powergrid-admin/target/*.jar → 复制 + 重命名至 powergrid-docker/webapp/powergrid-admin.jar → docker build → docker load → docker compose up -d
总结
这套流程的核心不在于 Docker 或 Maven 本身,而在于清楚每一步产物的位置、使用者及更新时机。理解这一点后,更换服务器、项目或镜像源均可举一反三。

