Maven打包机制解析:Fat JAR生成原理与实践

发布时间:2026/11/4 16:58:12

Maven打包机制解析:Fat JAR生成原理与实践 1. 问题现象与背景疑惑最近在Java项目构建时遇到一个有趣现象明明没有显式配置maven-assembly-plugin或maven-shade-plugin这类专门打包Fat JAR的插件但最终生成的JAR包却包含了所有依赖库。这让我产生了两个疑问为什么没有专用插件也能生成Fat JAR不同打包插件之间究竟存在怎样的协作或冲突关系通过分析Maven核心机制和插件默认行为发现这背后涉及Maven生命周期的阶段绑定、插件默认配置以及各打包工具的设计哲学。下面通过具体案例拆解其中的运作原理。2. Maven基础构建流程解析2.1 标准打包生命周期阶段Maven构建过程分为三套独立生命周期clean/default/site其中default生命周期包含项目编译打包的核心阶段。与JAR打包直接相关的阶段包括process-resources处理资源文件compile编译主代码process-test-resources处理测试资源test-compile编译测试代码test运行单元测试package打包构建产物install安装到本地仓库deploy部署到远程仓库2.2 maven-jar-plugin的默认绑定在pom.xml未显式配置时Maven会为packaging为jar的项目自动绑定maven-jar-plugin到package阶段。这是通过Maven核心的default生命周期映射实现的。通过命令可查看实际绑定的插件mvn help:effective-pom -Dverbose | grep maven-jar-plugin输出示例显示默认配置plugin artifactIdmaven-jar-plugin/artifactId version3.2.0/version executions execution iddefault-jar/id phasepackage/phase goals goaljar/goal /goals /execution /executions /plugin3. Fat JAR生成的三种典型场景3.1 场景一默认打包的伪Fat JAR当项目仅依赖maven-jar-plugin时生成的JAR可能包含部分依赖这通常由以下原因导致依赖scope为system通过systemPath指定的本地依赖会被直接包含未声明依赖scope默认compile范围的依赖可能被内联资源文件包含依赖src/main/resources目录下的库文件会被打包注意这种伪Fat JAR往往缺少传递依赖运行时会出现ClassNotFoundException3.2 场景二assembly-plugin的归档策略maven-assembly-plugin通过descriptorRef配置实现全量打包。典型配置plugin artifactIdmaven-assembly-plugin/artifactId executions execution phasepackage/phase goalsgoalsingle/goal/goals configuration descriptorRefs descriptorRefjar-with-dependencies/descriptorRef /descriptorRefs /configuration /execution /executions /plugin其工作原理是在package阶段后执行绑定到phase收集所有runtime范围的依赖解压依赖JAR后重新压缩到最终包中3.3 场景三shade-plugin的字节码融合maven-shade-plugin提供更高级的功能plugin artifactIdmaven-shade-plugin/artifactId executions execution phasepackage/phase goalsgoalshade/goal/goals configuration transformers transformer implementation... mainClasscom.example.Main/mainClass /transformer /transformers /configuration /execution /executions /plugin与assembly-plugin的区别处理依赖冲突时进行类重命名relocation支持合并ServiceLoader配置文件可自定义主类清单MANIFEST.MF4. 插件执行顺序的深度解析4.1 生命周期阶段与插件执行顺序当多个插件绑定到同一阶段时执行顺序由pom.xml中的声明顺序决定。例如build plugins plugin !-- 先执行的插件 -- /plugin plugin !-- 后执行的插件 -- /plugin /plugins /build4.2 典型冲突案例假设同时配置了jar-plugin和shade-pluginjar-plugin先执行生成原始JARshade-plugin后执行生成shaded JAR最终仓库安装的是最后一个插件生成的产物可通过指定classifier区分不同产物configuration classifieroriginal/classifier /configuration5. 生产环境最佳实践5.1 插件选型建议需求场景推荐插件理由简单可执行JARmaven-jar-plugin轻量级无需额外配置包含第三方依赖maven-assembly-plugin配置简单支持多种格式需要处理依赖冲突maven-shade-plugin类重命名解决冲突Spring Boot项目spring-boot-maven-plugin专为Boot应用优化5.2 常见问题排查指南问题一依赖缺失检查依赖scope是否为runtime/provided确认是否配置了正确的descriptorRef问题二主类未生效确认MANIFEST.MF是否包含Main-Class对于shade插件检查transformer配置问题三重复类冲突使用shade插件的relocation功能relocations relocation patterncom.google.guava/pattern shadedPatternshaded.com.google.guava/shadedPattern /relocation /relocations6. 底层机制原理解析6.1 Maven依赖解析机制Maven通过以下顺序解析依赖本地仓库查找中央仓库下载根据scope过滤依赖compile传递依赖provided不打包runtime打包但不编译6.2 插件覆盖规则当多个插件声明相同goal时子pom配置覆盖父pom后声明的插件覆盖先声明的显式配置覆盖默认配置可通过mvn help:effective-pom验证最终生效的配置。
延伸阅读

更多相关文章

2026/11/4 16:58:12

中望3D2026点云与STL坐标系对齐实战指南

1. 项目概述:为什么“摆正”点云和STL不是个简单操作? 在中望3D 2026里做逆向建模,最常卡住人的地方,不是建模本身,而是第一步——把扫描进来的点云和后续生成的STL模型“摆正”。这个词听起来像调个角度那么简单&…

2026/11/4 16:58:12

Python手写编译器前端:词法分析、递归下降与AST符号表

简介:围绕简单文法编译器前端设计展开的课程设计报告,面向学习编译原理、需要完成课程设计或动手实现小型编译器的计算机专业学生。内容以词法分析、语法语义分析与中间代码生成为主线,覆盖词法扫描器与Token序列生成、递归下降子程序法、四元…

2026/11/4 16:58:12

6G卫星通信的物理限制与工程实践解析

1. 当6G愿景撞上物理定律:卫星通信的硬约束解析 上周和航天院的几位工程师撸串时,他们吐槽说现在6G白皮书里那些"全域覆盖""亚毫秒时延"的承诺,就像给原始人画5G基站覆盖图。这让我想起去年参与低轨卫星组网测试时&#…

2026/11/4 19:53:52

【共创稿事节】HarmonyOS 7.0 HiLog分级日志:从接入到生产验证

HiLog 是鸿蒙日志体系里最不起眼的组件——写日志谁不会?但健康菜谱助手的一次线上排查让我意识到,乱写的日志比没有日志更糟:两万条 INFO 日志淹没了唯一的 ERROR,关键线索被刷掉,排查多花了四小时。这篇记录 HiLog 的分级体系、域与标签的设计、隐私合规的 %{public} 与 %{p…

2026/11/4 19:53:52

跟客户谈精度验收:为什么“0.01mm“写进合同就是个坑

跟客户谈精度验收:为什么"0.01mm"写进合同就是个坑 【摘要】 精度验收是工控行业最容易扯皮的环节,而扯皮的根源往往在签合同之前就埋下了:精度指标没写工况、没写测量方法、没写测量设备。这篇讲四件事:为什么合同里光…

2026/11/4 19:53:52

用需求评审的方式,判断一个证书该不该考

用需求评审的方式,判断一个证书该不该考 朋友问我:成年人学洞箫要不要考级。我本能地想按需求评审的流程拆一遍——因为这道题的形状,和"要不要接这个需求"几乎一模一样。 先看外部环境:这个证书的信用在下降 上海音协的…

2026/11/4 19:53:52

静态效果图怎么“活“起来?建筑漫游与AI动画的分工、用法和边界

静态效果图一直是方案沟通的主力:一张图说清体块、立面、材质和场地关系。但它有个天生的短板——看不见行进感。空间尺度、光影变化、人走进去是什么感受,单张图传达不了。 所以这两年"让静态方案动起来"的需求很集中。传统做法是三维软件里设…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/3 14:24:53

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/4 0:03:20

AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年…

2026/11/4 0:03:20

从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你…

2026/11/4 0:03:20

32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/3 14:24:53

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑