jar包冲突原因
前段时间,因为经历了项目重构,引入很多包,加上管理不善,出现了很多jar包冲突问题。当时项目想用spring管理hbase实例,引入了org.springframework.data,spring-data-hadoop,2.5.0.RELEASE jar包
,出现了guava包的冲突,tomcat对servlet-api加载冲突问题。在最近的开发中也遇到了curator-client包冲突问题。借着这次机会,顺便学习写博客。
其实在java开发中,jar hell是一个很常见的问题,主要是因为jvm在加载的过程中,项目的加载的顺序问题。同一个类(全限定名相同)在jvm中只会加载一次,这里面涉及到类加载和maven依赖管理的知识点。当然,maven已经给我们提供了很多解决的方法。
冲突原因
造成jar包冲突的原因主要有两种
1. 第一种是一个项目,依赖了同一个项目的两个版本。
2. 第二种冲突原因是不同项目中,出现了相同的类。何为相同的类,即类的全限定名相同。
一般的错误有:
找不到方法:java.lang.NoSuchMethodError
找不到类:Exception in thread "main" java.lang.NoClassDefFoundError
找不到变量:Exception in thread "main" java.lang.NoSuchFieldError
项目工程
- 引入5个项目工程做说明:分别为leaf-verb-a(简称a),leaf-verb-b(简称b),leaf-verb-c(简称c),leaf-verb-d(简称d),leaf-verb-e(简称e)