Java类冲突、包冲突maven插件瞎搞

又碰到java.lang.NoSuchMethodException,有木有?明明感觉有这个方法啊?有木有?找了半天才发现引用了两个不同版本的jar包,有木有?有时候包并不是a-2.5.jar,a-1.5.jar这种很简单的版本关系,有可能包的名称互不相干,有木有?反正我是遇到了很多次了,烦躁死了,一般造成这种问题的原因是在不同的包中存在了相同的全路径类名,但是在类加载器加载class时却加载了一个错误的class导致。这种问题一般只有在运行时才容易暴露出来,那么有木有办法在我们开发过程中检测出来呢?当然有。目前如果使用maven 构建工具,那么maven有一系列依赖插件可以使用,这里给一个地址。

虽然可以用这些工具进行一些依赖分析,不过他们仅限于对直接配置在pom中的jar包有无重复进行判定,没有办法直接对重复的同名类进行查找对比。针对这个情况,周末花了一点时间自己写了个maven插件,专门来报告重复的类的情况,以便在上线之前就对其做一个预处理,这个插件有三个打印格式:

仅打印重复的类所在的包对:[WARNING] [spring-2.5.6.jar, spring-jdbc-2.5.6.jar][WARNING] [resource-1.0.jar, toolkit-service-resource-1.0.jar][WARNING] ======================================重复类数量:3188个 涉及JAR包数量:89个=========================================

表示spring-2.5.6.jar,和spring-jdbc-2.5.6.jar存在类名冲突,这是很明显的,不过这里关系不大,因为他们版本都一致,,类的定义都完全相同,不过版本不一致就要注意了,最下面一行是重复的类的个数和JAR包个数。

仅打印重复的类:[WARNING] org/apache/bcel/generic/INVOKESPECIAL.class[WARNING] org/springframework/jdbc/support/nativejdbc/NativeJdbcExtractorAdapter.class[WARNING] org/apache/bcel/generic/IF_ICMPEQ.class[WARNING] org/springframework/beans/factory/support/StaticListableBeanFactory.class[WARNING] ======================================重复类数量:3188个 涉及JAR包数量:89个=========================================打印重复的类和对应所在的包[WARNING] org/apache/bcel/generic/INVOKESPECIAL.class=[bcel-5.2.jar, xalan-2.6.0.jar][WARNING] org/springframework/jdbc/support/nativejdbc/NativeJdbcExtractorAdapter.class=[spring-2.5.6.jar, spring-jdbc-2.5.6.jar][WARNING] org/apache/bcel/generic/IF_ICMPEQ.class=[bcel-5.2.jar, xalan-2.6.0.jar][WARNING] org/springframework/beans/factory/support/StaticListableBeanFactory.class=[spring-2.5.6.jar, spring-beans-2.5.6.jar][WARNING] ======================================重复类数量:3188个 涉及JAR包数量:89个=========================================

一般来第三种打印方式和第一种打印方式比较用,配合maven原来有的dependency:tree 目标,可以查到具体是我们应用中哪个包间接引进来的,并加以解决。

包冲突解决建议:

1、一一般全包和子包可以并存,但是需要版本保持一致例如:spring.jar和spring-jdbc.jar等等,但是应该尽量只用其中一个。

maven插件下载地址:

那我想明天可以是我的来世。

Java类冲突、包冲突maven插件瞎搞

相关文章:

你感兴趣的文章:

标签云: