我们知道maven有传递性依赖机制,举例来说,当我们需要A的依赖的时候,就会在pom.xml中引入A的jar包;而A的jar包中依赖了B的jar包,这样Maven在解析pom.xml的时候,会依次将A、B 的jar包全部都引入进来。
这样就会造成一个问题:
如果C的methodC使用了新版本G21才拥有的新类/新方法,程序中调用了C对应G21的新类/新方法时,因为项目中引用的是G20,所以JVM去加载Class时就会发现G20没有这个类,就会抛出ClassNotFoundException;同样,调用G20没有的新方法时会抛出NoSuchMethodError。
一般来说,使用IDEA插件是一个简便的排查方法
通过Maven命名行的方式也是也不错的选择:
例如:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<exclusions>
<exclusion>
<artifactId>error_prone_annotations</artifactId>
<groupId>com.google.errorprone</groupId>
</exclusion>
</exclusions>
</dependency>
在引用guava时将com.google.errorprone这个包排除掉。
当然也有一些其他方法,对我来说第一种已经满足日常使用了。
最重要的还是要主动避免jar包冲突的情况,在父pom文件中利用 ,对依赖Jar包进行统一版本管理,一劳永逸。通常的做法是,在parent模块的pom文件中尽可能地声明所有相关依赖Jar包的版本,并在子pom中简单引用该构件即可。
例如在父pom文件中定义lombok的版本:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
</dependencies>
</dependencyManagement>
然后在子moudle中:
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
子moudle中自动会引用版本为1.18.10的lombok Jar包
全部评论