跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

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

基于 Maven 和 Docker 实现 Java Web 应用打包与部署的流程涉及多模块工程构建、JAR 包定位、镜像构建及服务器部署。首先利用 IDEA Maven 面板执行 clean 和 package 命令生成产物,确认 JAR 位于 admin 模块 target 目录下。接着将 JAR 包搬运至 Docker 构建目录并规范命名,若遇到基础镜像拉取失败,可通过加载本地 tar 包并修改标签的方式绕过。最终通过 docker build 构建镜像,在服务器上加载镜像并使用 docker compose 启动服务,配合日志命令验证运行状态。关键在于理清各阶段文件路径与依赖关系。

蜜桃汽水发布于 2026/3/15更新于 2026/5/3129 浏览

背景说明

在实际项目开发中,代码完成并不等同于可以上线。尤其是 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 中的具体操作步骤

  1. 打开 Maven 面板:在 IDEA 右侧点击 Maven 面板。
  2. 执行 clean:双击 Lifecycle → clean,清空历史编译产物,避免旧代码污染新包。
  3. 执行 package:clean 完成后,双击 Lifecycle → package。若担心测试失败,可点击 ⚡ Skip Tests。
  4. 确认打包成功:控制台显示 [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 的文件。

正确覆盖步骤

  1. 复制新生成的 JAR:powergrid-admin/target/powergrid-admin-3.8.9.jar
  2. 粘贴到 Docker 目录:powergrid-docker/webapp/
  3. 删除旧文件
  4. 重命名为: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 强依赖该基础镜像。

解决思路:移花接木

  1. 加载旧镜像:
docker load -i ..\exported_images\powergrid-docker-webapp.tar
  1. 查看镜像:
docker images
  1. 改名伪装:
docker tag powergrid-docker-webapp:latest openjdk:8-jdk
  1. 重新 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 本身,而在于清楚每一步产物的位置、使用者及更新时机。理解这一点后,更换服务器、项目或镜像源均可举一反三。

目录

  1. 背景说明
  2. 项目整体结构说明
  3. 第一阶段:使用 IDEA + Maven 正确打包项目
  4. 为什么一定要用 Maven Lifecycle?
  5. IDEA 中的具体操作步骤
  6. 第二阶段:找到真正要用的 JAR 包
  7. JAR 位置
  8. 为什么是 admin 模块?
  9. 第三阶段:覆盖 Docker 使用的 JAR
  10. Docker 只认一个名字
  11. 正确覆盖步骤
  12. 第四阶段:Docker 构建镜像
  13. Docker 构建失败处理:openjdk:8-jdk 拉不下来怎么办?
  14. 问题本质
  15. 解决思路:移花接木
  16. 第五阶段:服务器部署
  17. 传输镜像
  18. 加载镜像
  19. 重启服务
  20. 查看日志
  21. 完整流程总结
  22. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • SQL Server 2025 数据库安装图文教程
  • Arduino BLDC 基于串口指令的远程控制工业巡检机器人
  • GitHub 分支保护规则设置:禁止直接 Push 强制 Pull Request
  • AI 图像生成指南:从原理到实战
  • AI 辅助 Android Studio 快速搭建 WebView 项目模板
  • 企业微信群机器人发送 Markdown 消息及表格支持
  • DeepSeek R1 接入 VSCode 实现智能编码提效
  • AI 大模型通信机制:流式传输与数据封装逻辑解析
  • EhViewer 安卓客户端安装与使用指南
  • 10 个大型语言模型 (LLM) 核心面试题与解析
  • Flutter 三方库 flutter_cors 应对鸿蒙 Web 与混合开发中的跨域挑战
  • PageIndex 无分块文档索引系统实战指南
  • 2026 AI 编码工具对比:Claude、Cursor、Copilot 选型指南
  • Ubuntu 部署 OpenClaw 并接入飞书机器人
  • Spring AI 接入 Agent Skill 实战指南
  • 腾讯 WorkBuddy:免部署 AI 智能体办公工具评测与对比
  • 66 个机器人项目合集:科研、教育、工业与医疗方向资源整理
  • IntelliJ IDEA 集成使用 Claude Code 方法指南
  • ChatGPT 抵制运动与军方合作争议:AI 伦理及具身智能产业化现状
  • 深入 llama.cpp:llama-server 从命令行到 HTTP Server

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online