开发java应用,包冲突是经常遇见的,如何快速的定位冲突,并且解决十分重要。
下面通过工作中的一个例子来引出一些排查的常用工具。
(1)查看某一个方法是引用的那个包,可以在debug的时候通过反射中的这个方法看一下
例如查看CollectionUtils这个类的jar包的信息,可以这样:
CollectionUtils.class.getProtectionDomain().getCodeSource();
(2)如何查看maven工程中的jar包的情况?
在maven工程的父目录来执行这个命令,显示全部工程的包的信息
mvn compile dependency:tree
可以通过">"来重定向到一个文件,方便来进行查看。
如果知道特定的子module,则可以进入到特定的module,来进行打印依赖树。
上面的例子。在web这个module下面,果然没有看到commons-collections这个jar包。
所以问题就定位了呵呵。
(3)如何解决冲突?
一般情况下问题定位了就能够很快的解决冲突了。
上述情况是因为没有引入jar包导致的,解决办法,直接在pom文件中加入jar包即可,当然这是最简单的包问题了。
其余的一般可以通过修改pom文件来进行解决,下面就pom文件解决冲突的几类常见方法说明一下。
maven的冲突解决需要对于maven的依赖机制了解比较深入,这样处理问题才能游刃有余,推荐一个博客,上面的文章很好,可以学习一下。
http://www.juvenxu.com/
还有博客作者的书《maven实战》上面写的很详细,对于maven入门以及深入了解很有帮助。
(4)线上的话如何来看代码的类的jar包的信息呢?
上面的一些方法能够解决大部分的问题,但是如果是线上出现这种情况,或者上面的方法没有办法查看到,那如何处理呢。
不用担心,公司的一位大神撒迦写了一个类,来搞定这些。
博客地址在这里:http://rednaxelafx.iteye.com/blog/1295944
代码和执行命令都在这里,有了这个之后,线上排查问题就能够非常方便了呵呵。
https://gist.github.com/1441625#file_command_prompt