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

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

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

仅打印重复的类所在的包对:

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


仅打印重复的类:

打印重复的类和对应所在的包


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

 

包冲突解决建议:

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

 

maven插件下载地址:http://code.google.com/p/lovingprince/

posted @ 2011-07-04 21:29  lovingprince  阅读(4599)  评论(0编辑  收藏  举报