声明:本篇博客只对 Maven Helper 的使用方法进行深入探究,安装及使用博客推荐:idea 中解决maven 包冲突的问题(maven helper)
抛出问题:NoClassDefFoundError
当我在业务中调用公司的 ID 生成器组件时,使用 Maven Helper 插件发现这个组件 jar 包存在两种不同版本的引用:
依着一般保留最新版本的原则,我在 1.1.1 版本上Exclude了一下解决了冲突。
结果启动 Tomcat 服务器对组件进行调用时,发生了NoClassDefFoundError异常!
案发现场:一个多模块的 JavaWeb 应用
JavaWeb 多模块应用:父 pom 文件做版本控制,Web 模块引用 Biz 模块,Biz模块引用 Service 模块,Service 模块引用 dao 模块,这样层级引用。
解决冲突:jar 包没有被引入
首先,我们找到 web 模块下项目发布输出的target文件夹,在lib中发现jar包确实没有被引入!
然后想了一下,是不是解决依赖时出现了问题,于是发现在biz.pom文件中仍然存在 ID 生成器组件的不同版本的 jar 包依赖:
于是我开始怀疑人生:
当我Exclude时,Maven Helper插件究竟为我做了什么?
在我一顿测试之后发现了问题:
- jar 包冲突实际发生在 biz 层,web 层也出现冲突,是因为 web 层引用了 biz 层;
- 我实际在 web 层的 1.1.1 版本上
Exclude了一下,结果 Maven Helper 在web.pom文件中去除了这个依赖:
Maven Helper 的使用总结
- 遇到
NotClassFound异常,先到target/web模块名/WEB-INF/lib文件夹中看 jar 包是否被真正的引入; - 解决冲突要在引入的最底层去
Exclude解决,比如我这次,需要在 biz 层Exclude低版本的 ID 生成组件版本!