简介
在使用Maven时,有时会遇到jar包冲突的问题,也就是多个依赖中包含了同名的jar包,在编译或运行时会导致异常。
解决maven jar包冲突的方法
1、利用maven的Exclusions功能排除依赖
2、利用maven的scope功能,限制依赖的使用范围
控制 dependency(依赖)元素的使用范围。通俗的讲,就是控制 Jar 包在哪些范围被加载和使用。这个范围包括,编译、测试、运行,并且还可以加上是否被打入包中。
Scope的作用域范围包括compile、test、provided、runtime、system、import。
上面的2种解决方法,很容易解决编译时的问题,但是运行时可能导致类或方法找不到的问题。
3、利用maven-shade-plugin的重定位类(Relocating Classes)功能,把依赖的第三方jar包重命名后打包到项目的jar包
比如Flink的大多数依赖项,如guava、netty、jackson等,都被Flink的维护人员通过重定位类维护。
这种解决方案比较实用,但是很难解决第三方依赖之间的冲突。
4、类隔离策略
为了解决运行时类冲突,很多技术都实现了类隔离策略,比如大数据框架Flink、蚂蚁金服的SOFAArk、tomcat等。
比如tomcat为了实现运行时隔离采用的类加载策略:
小结
如果又遇到maven jar包冲突了,可以使用上面比较常见的这几种处理方法来解决,每种解决方案都有其适用场景。