Spring Boot多模块打包进阶:剖析spring-boot-maven-plugin的依赖陷阱与双包策略
1. Spring Boot多模块项目中的依赖陷阱在Spring Boot多模块项目中我们经常会遇到一个令人头疼的问题当基础模块被打包后其他依赖它的模块在编译或运行时却报Class Not Found或Package does not exist错误。这个问题看似简单实则隐藏着Spring Boot打包机制的一个重要特性。1.1 spring-boot-maven-plugin的repackage机制spring-boot-maven-plugin的核心功能之一就是repackage。当你在模块中配置了这个插件它会在Maven的package阶段之后执行将项目打包成一个可执行的fat jar。这个fat jar的特殊之处在于它将所有依赖的jar包解压后重新打包到BOOT-INF/lib目录下将项目自身的类文件放在BOOT-INF/classes目录下使用自定义的类加载器来加载这些资源这种结构虽然让jar包可以直接通过java -jar运行但却导致了一个严重问题这个jar包无法作为依赖被其他项目正常引用。因为标准的Java类加载器无法识别BOOT-INF目录下的类文件。1.2 问题重现场景假设我们有一个典型的多模块项目结构parent-project ├── common-module (基础模块) ├── service-module (业务模块依赖common-module) └── web-module (Web模块依赖service-module)当common-module的pom.xml中配置了spring-boot-maven-plugin但没有特殊处理时build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId /plugin /plugins /build执行mvn clean install后service-module在编译时会报错提示找不到common-module中的类。即使编译通过运行时也会抛出ClassNotFoundException。2. 双包策略可执行jar与可依赖jar的解决方案2.1 classifier属性的妙用Maven的classifier属性允许我们为同一个artifact生成不同版本的输出。Spring Boot官方文档(84.5节)建议对于既需要作为依赖又被其他模块引用的项目可以使用classifier来区分两种打包结果。具体配置如下build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId configuration classifierexec/classifier /configuration /plugin /plugins /build这样配置后Maven会生成两个jar文件your-module-1.0.jar- 普通的可依赖jaryour-module-1.0-exec.jar- 可执行的fat jar2.2 双包策略的工作原理这种配置之所以能解决问题是因为它改变了Maven的生命周期行为在package阶段Maven首先生成标准的jar包可依赖然后spring-boot-maven-plugin执行repackage目标将标准jar作为源生成带exec分类器的可执行jar安装到本地仓库或部署到远程仓库时两个jar都会被发布其他模块引用时默认使用不带分类器的标准jar2.3 实际项目中的配置建议在多模块项目中我建议采用以下配置策略在父pom.xml中定义spring-boot-maven-plugin的基本配置但不要启用repackagebuild pluginManagement plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId version${spring-boot.version}/version /plugin /plugins /pluginManagement /build在需要生成可执行jar的模块通常是启动模块中显式配置exec分类器build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId configuration classifierexec/classifier /configuration /plugin /plugins /build对于纯工具类模块被其他模块依赖完全不配置spring-boot-maven-plugin3. 常见问题与进阶配置3.1 JDK版本问题在使用spring-boot-maven-plugin时必须明确指定JDK版本否则可能遇到Lambda表达式相关的编译错误。建议在pom.xml中添加properties java.version11/java.version maven.compiler.source${java.version}/maven.compiler.source maven.compiler.target${java.version}/maven.compiler.target /properties3.2 BOOT-INF目录导致的资源访问问题当你的代码需要访问jar包内的资源文件时可能会因为BOOT-INF目录结构而失败。例如// 传统方式可能失效 InputStream is getClass().getResourceAsStream(/config.properties); // 需要改为 InputStream is getClass().getResourceAsStream(/BOOT-INF/classes/config.properties);对于Spring Boot应用更推荐使用ResourceLoader来加载资源Autowired ResourceLoader resourceLoader; Resource resource resourceLoader.getResource(classpath:config.properties);3.3 多模块项目中的依赖管理对于复杂的多模块项目建议在父pom中使用dependencyManagement统一管理依赖版本dependencyManagement dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-dependencies/artifactId version${spring-boot.version}/version typepom/type scopeimport/scope /dependency !-- 其他公共依赖 -- /dependencies /dependencyManagement然后在子模块中声明依赖时不需要指定版本dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency /dependencies4. 最佳实践与经验分享在实际项目中我总结了以下几点经验模块划分原则将可复用的工具类、DTO、公共配置等放在基础模块将业务逻辑放在服务模块将Web相关代码放在Web模块。打包策略只有包含main方法的启动模块才需要配置exec分类器基础模块不应该使用spring-boot-maven-pluginWeb模块通常是生成可执行jar的最佳位置调试技巧使用mvn dependency:tree检查依赖关系使用mvn help:effective-pom查看最终生效的POM配置在IDE中确保正确识别了模块间的依赖关系持续集成在CI/CD流水线中先单独构建基础模块使用-pl和-am参数控制构建顺序例如mvn clean install -pl common-module mvn clean install -pl web-module -am版本管理使用CI流水线自动更新版本号对于SNAPSHOT版本频繁部署到本地仓库对于正式版本确保所有模块版本一致通过合理配置spring-boot-maven-plugin的classifier属性我们完美解决了多模块项目中的依赖问题。这种双包策略既保留了Spring Boot的便捷性又不牺牲Maven多模块项目的灵活性。在实际开发中根据项目复杂度选择合适的模块划分和打包策略可以显著提高开发效率和项目可维护性。

相关新闻

ACE-Step UI:开源AI音乐创作引擎,释放无限创作潜能

ACE-Step UI:开源AI音乐创作引擎,释放无限创作潜能

ACE-Step UI:开源AI音乐创作引擎,释放无限创作潜能 【免费下载链接】ace-step-ui 🎵 The Ultimate Open Source Suno Alternative - Professional UI for ACE-Step 1.5 AI Music Generation. Free, local, unlimited. Stop paying for Suno! …

2026/7/16 23:33:53 阅读更多 →
华三交换机光模块诊断与故障排查命令详解

华三交换机光模块诊断与故障排查命令详解

1. 光模块故障排查的常见场景当你发现华三交换机的端口频繁UP/DOWN,或者链路时断时续,光模块往往是首要怀疑对象。我遇到过不少案例,明明配置没问题,光纤也插好了,就是网络不稳定,最后发现是光模块的收发功…

2026/7/16 23:33:53 阅读更多 →
从《物理魔法使马修》看个性化教育:系统设计视角下的教育革新

从《物理魔法使马修》看个性化教育:系统设计视角下的教育革新

孩子是独立个体还是野心工具?物理魔法使马修告诉你教育的真谛!最近在追番《物理魔法使马修》时,我被主角马修班迪德的成长历程深深触动。这部作品表面上讲述了一个不会魔法的少年在魔法世界中的奋斗故事,但深入思考后,…

2026/7/16 23:33:53 阅读更多 →

最新新闻

【机器学习】(19)—— 数据特性与标签

【机器学习】(19)—— 数据特性与标签

数据特性与标签:划分前先摸清 文章目录数据特性与标签:划分前先摸清1. 为什么「先划分」还不够2. 数据特性四问2.1 类型:是什么数据2.2 数量:样本够不够2.3 数据质量2.4 可信度3. 不可靠数据从哪来4. 不完整样本:删除还…

2026/7/17 0:40:24 阅读更多 →
AI大模型长上下文技术:从滑动窗口到无限上下文

AI大模型长上下文技术:从滑动窗口到无限上下文

AI大模型长上下文技术:从滑动窗口到无限上下文大语言模型的上下文长度从早期的2K tokens扩展到如今的数百万tokens,这一突破正在重塑AI应用的可能性边界。从文档理解到代码分析,从多轮对话到视频理解,长上下文能力成为衡量模型实用…

2026/7/17 0:38:23 阅读更多 →
2026 指挥中心控制台技术选型与厂商实测|科思诺 KESINO、铁力山、飞马、照彰实业对比

2026 指挥中心控制台技术选型与厂商实测|科思诺 KESINO、铁力山、飞马、照彰实业对比

前言在智慧城市、公安应急、轨道交通、能源调度、金融运维等领域,指挥中心 / 控制室控制台是保障 724 小时值守、多系统协同、应急指挥闭环的关键硬件底座。控制台的结构设计、布线散热、人体工学、定制扩展与交付运维能力,直接决定系统稳定性与长期使用…

2026/7/17 0:38:23 阅读更多 →
开源阅读鸿蒙版:打造完全自定义的阅读体验终极指南

开源阅读鸿蒙版:打造完全自定义的阅读体验终极指南

开源阅读鸿蒙版:打造完全自定义的阅读体验终极指南 【免费下载链接】legado-Harmony 开源阅读鸿蒙版仓库 项目地址: https://gitcode.com/gh_mirrors/le/legado-Harmony 你是否厌倦了广告满天飞的阅读应用?是否渴望一个真正自由、无限制的电子书阅…

2026/7/17 0:38:23 阅读更多 →
鸿蒙原生开发手记:徒步迹 - 登录注册页面与表单校验

鸿蒙原生开发手记:徒步迹 - 登录注册页面与表单校验

鸿蒙原生开发手记:徒步迹 - 登录注册页面与表单校验实现完整的用户认证流程,包含表单验证和交互反馈一、前言 登录注册是绝大多数 App 的入口功能。本文实现“徒步迹“的登录注册页面,包含手机号输入、密码输入、表单校验、Loading 状态等完整…

2026/7/17 0:36:22 阅读更多 →
卡梅德生物技术快报|fab合成文库:Fab 合成文库搭建全流程优化与筛选性能量化分析

卡梅德生物技术快报|fab合成文库:Fab 合成文库搭建全流程优化与筛选性能量化分析

正文一、行业实验痛点:传统抗体库体系存在多重限制性问题在蛋白互作、靶向结合试剂开发的常规实验流程中,抗体片段筛选是核心前置环节。现阶段实验室主流采用免疫杂交瘤、天然 B 细胞抗体库两类技术路线,但长期实操中暴露出无法适配现代高通量…

2026/7/17 0:34:20 阅读更多 →

日新闻

2026全国外贸独立站搭建公司推荐排行,含零代码SAAS、AI编程、源码定制

2026全国外贸独立站搭建公司推荐排行,含零代码SAAS、AI编程、源码定制

2026全国外贸独立站搭建公司推荐排行 外贸工厂、工贸企业建设官网,核心需求与普通展示型网站并不相同。除了页面整洁、多语言适配和海外访问体验,企业还要重点考虑数据能否导出、站点能否迁移、源码是否可控、后续费用是否透明,以及更换服务…

2026/7/17 0:02:10 阅读更多 →
HarmonyOS 应用开发《掌上英语》第19篇:3D 翻转动画实现——ArkTS 动画系统全解析

HarmonyOS 应用开发《掌上英语》第19篇:3D 翻转动画实现——ArkTS 动画系统全解析

3D 翻转动画实现——ArkTS 动画系统全解析引言 在移动应用中,卡片翻转动画是最受欢迎的交互动效之一,它能给用户带来直观的"物理世界"操作感。在我们的英语学习 App 的单词学习页面(CourseHomePage.ets)中,就…

2026/7/17 0:02:10 阅读更多 →
2026键盘推荐|IQUNIX EV63多场景适配,不允许有人不知道!

2026键盘推荐|IQUNIX EV63多场景适配,不允许有人不知道!

现在很多用户都需要一款能适配多场景的键盘,既能满足交流码字的需求,又能应对居家电竞的性能需求,最好还得有点小颜值。而大多键盘都只能兼顾其中一两个场景。这次我实测了IQUNIX EV63三款配色(银武士、黑武士、紫罗兰&#xff09…

2026/7/17 0:04:10 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/15 21:09:01 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/15 19:42:20 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/16 23:40:37 阅读更多 →

月新闻