基于 Maven + Docker 的 WebApp 打包与部署

一、背景说明:为什么要这么折腾一套 Maven + Docker 流程?

在实际项目开发中,代码写完 ≠ 可以上线。尤其是 Java Web 项目,往往涉及:

  • 多模块 Maven 工程

  • WebApp 主模块

  • Docker 镜像封装

  • 离线/内网服务器部署

很多同学在这个阶段会遇到几个典型问题:

  1. IDEA 里代码改好了,但 Docker 里跑的还是旧代码

  2. Maven 打包出来的 JAR 不知道该用哪个

  3. Docker build 一直卡在 openjdk 镜像拉取

  4. 服务器上更新一次代码,要手动搞半天

本文将严格按照你当前 powergrid 项目的真实流程,从 IDEA 打包开始,一步一步,完整讲清楚:

如何把最新 Java Web 代码,稳定、可控地打包成 Docker 镜像,并部署到服务器运行


二、项目整体结构说明(先搞清楚你在操作什么)

在开始之前,我们先明确几个关键目录(非常重要,比如我的项目):

复制代码
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

中间这一步「搬运 + 覆盖」,就是 90% 人出问题的地方。


三、第一阶段:使用 IDEA + Maven 正确打包项目

3.1 为什么一定要用 Maven Lifecycle?

你的项目是一个 多模块 Maven 工程,如果你只单独对某个模块打包:

  • 很可能依赖没编全

  • 很可能版本不一致

正确做法:从根模块统一打包


3.2 IDEA 中的具体操作步骤(图形化)

第一步:打开 Maven 面板

在 IDEA 右侧,点击 Maven 面板,你会看到类似:

复制代码
powergrid
├── Lifecycle
│   ├── clean
│   ├── package
│   ├── install

⚠️ 注意:

  • 请选择最顶层的 powergrid(不是 admin)

第二步:执行 clean

  • 双击 Lifecycle → clean

  • 作用:清空历史编译产物

这是一个好习惯,避免旧代码污染新包。


第三步:执行 package

  • clean 完成后

  • 双击 Lifecycle → package

如果你担心测试失败:

👉 点击 Maven 面板上的 ⚡ Skip Tests


第四步:确认打包成功

控制台看到以下内容,说明成功:

复制代码
[INFO] BUILD SUCCESS
[INFO] Finished at: xxxx

并且所有模块都是 SUCCESS。


四、第二阶段:找到真正要用的 JAR 包

4.1 JAR 在哪里?(重点)

Maven 打包完成后:

  • 真正要运行的 JAR 一定在:

    powergrid-admin/target/

你会看到类似:

复制代码
powergrid-admin.jar

4.2 为什么是 admin 模块?

因为:

  • admin 是 Spring Boot 启动模块

  • 其他模块只是被依赖

Docker 运行的就是它。


五、第三阶段:覆盖 Docker 使用的 JAR(最关键)

5.1 Docker 只认一个名字

查看 webapp/Dockerfile,你会看到类似:

复制代码
COPY powergrid-admin.jar /app/app.jar

⚠️ 这意味着:

Docker 只会找 powergrid-admin.jar


5.2 正确覆盖步骤(一步都不能错)

1️⃣ 复制新生成的 JAR

复制代码
powergrid-admin/target/powergrid-admin-3.8.9.jar

2️⃣ 粘贴到 Docker 目录

复制代码
powergrid-docker/webapp/

3️⃣ 删除旧文件

4️⃣ 重命名为:

复制代码
powergrid-admin.jar

5.3 常见错误(踩坑警告)

❌ 没改名

❌ 放错目录

❌ 覆盖失败

结果:Docker 跑的还是旧代码。


六、第四阶段:Docker 构建镜像

进入 webapp 目录:

复制代码
cd D:\com.powergrid\java\powergrid-docker\webapp\

执行构建:

复制代码
docker build -t powergrid-docker-webapp .

七、Docker 构建失败:openjdk:8-jdk 拉不下来怎么办?

这是你这个环境非常典型的问题

7.1 问题本质

  • 本地没有 openjdk:8-jdk

  • 镜像源 403

  • Dockerfile 又强依赖


7.2 解决思路:移花接木(非常实用)

第一步:加载旧镜像

复制代码
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 会"以为"自己找到了基础镜像。


八、第五阶段:服务器部署(三板斧)

8.1 传输镜像

把新的 powergrid-docker-webapp.tar 传到服务器。


8.2 加载镜像

复制代码
docker load -i exported_images/powergrid-docker-webapp.tar

8.3 重启服务

复制代码
docker compose up -d

8.4 查看日志

复制代码
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,而是:

你是否清楚每一步"产物在哪里、被谁用、什么时候更新"

只要你理解了这一点:

  • 换服务器

  • 换项目

  • 换镜像源

你都能举一反三。

相关推荐
BullSmall3 小时前
Sonarqube9.9 docker 镜像启动后 conf 下的配置文件没有了
docker·容器·eureka
ruofu333 小时前
wsl端是py312,但是项目是py311, 如何下载py311的依赖包(wheels)
python·docker
spider_xcxc4 小时前
Docker 实战:容器化多服务应用,Dockerfile 与 Compose 配置全解析
docker·云原生·eureka·虚拟化·容器化
晚风吹长发5 小时前
Docker使用——Docker容器及相关命令
linux·运维·服务器·docker·容器·架构
ShiXZ2135 小时前
Docker Compose 安装与配置指南
运维·docker·容器
豆角焖肉5 小时前
Maven进阶与搭建私服
java·maven
BullSmall6 小时前
Anolis OS 8.10 Docker 部署 SonarQube 9.9 完整教程
运维·docker·容器
开发者联盟league7 小时前
vscode 进入docker容器
vscode·docker
java_logo10 小时前
Apache Doris Docker 部署指南:实时分析数据库实战
数据库·docker·apache·doris·apache doris·轩辕镜像·docker部署doris
生活爱好者!1 天前
我把NAS当作下载机,docker一键部署qb
运维·docker·容器