jar包冲突 maven
近期在开发一个maven项目的时候,遇到了这样的报错:
java.lang.NoClassDefFoundError: com/google/common/base/MoreObjects
NoClassDefFoundError解决的三种办法(参考:https://my.oschina.net/jasonultimate/blog/166932):
1.首先是类在运行的时候依赖于其它的一个jar包,但是该jar包没有加载到classpath中或者是该jar包的名字被其他人改了,就像我的一个例子tibo.jar改为了tibco_v3.jar…….
2.运行的类不在classpath中,这个问题没有一个确定的方法去知道,但是很多时候你可以通过System.getproperty(”java.classpath“)方法,该方法能让你至少可以领略到实际存在的运行期间的classpath。
3.试着通过-classpath命令明确指出你认为正确的classpath,如果能够正常执行的话就说明你使用的classpath是正确的,而系统中的classpath已经被修该过了
这里只详细讲第一种情况。
遇到NoClassDefFoundError报错后,查看项目中是否有MoreObjects这个类,如果没有,pom文件中加入缺少的依赖。如果有,进入该类,查看它所在的jar包是否存在冲突(比如不同版本的同种jar包),发现冲突后,进入对应的pom文件,然后如图
显示依赖关系
根据这个依赖关系,可以找出jar包被谁依赖,逐步解决冲突。
我的项目中需要依赖guava19.0但是之前的许多相关联的项目中都间接依赖了guava14.0,如果14依赖的少,可以逐个exclude,但是依赖过多就不行了。
可以在根pom中写明,这样就会优先选择你指定的版本了
<dependencyManagement> <dependencies> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>19.0</version> </dependency> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>3.0.0</version> </dependency> </dependencies> </dependencyManagement>
祝好运。