Maven多模块项目如何添加公共依赖且不增大EAR包体积
方案可行性结论
你提出的新建app-lib公共依赖收纳模块的方案完全可行,且不会额外增大最终EAR包的体积。
为什么能解决本地运行报错问题
你当前将公共依赖全部声明在app-ear模块的配置,仅能在支持EAR类加载层级的Java EE生产环境中生效——生产环境中EAR下的所有子模块默认可以共享ear/lib目录下的依赖包。但IntelliJ本地运行、单模块单元测试时,默认会按照每个模块自身pom.xml的依赖树加载类,子模块未显式声明的依赖不会被加载,因此会出现类找不到的报错。
你调整为app-lib统一收纳公共依赖后,业务模块app-back、app-front显式依赖app-lib,依赖树会自动包含app-lib传递的所有公共依赖,IntelliJ就能正常识别到对应的类,解决本地运行报错问题。
为什么不会增大EAR包体积
只要你在业务模块声明对app-lib的依赖时,将依赖的scope设置为provided,同时在app-ear模块的pom中声明对app-lib的依赖即可:
- 打包时
app-lib以及它传递的poi等公共依赖,只会被打到app-ear的lib目录下 - 业务模块的jar/war包中不会重复打包
app-lib和公共依赖
最终生成的EAR包体积和你当前生产环境的包体积完全一致,不存在冗余。
三种模块结构说明
初始状态
app - app-ear - app-back -poi - app-front -poi
当前状态
app - app-ear - poi - app-back - app-front
可选方案(可落地生效方案)
app - app-ear - app-lib - poi - app-back -app-lib - app-front -app-lib
补充优化建议
如果不想额外新增模块,也可以使用Maven原生的dependencyManagement机制:在父pom的dependencyManagement节点统一声明所有公共依赖的版本,子模块需要使用时仅声明groupId和artifactId即可,也能避免重复声明版本的问题,可根据项目实际场景选择适配方案。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

