使用IntelliJ IDEA解决Java包冲突

在实际的 Maven 项目开发中,由于项目引入的依赖过多,遇到 jar 冲突算是一个很常见的问题了。那么,在这种情况下我们采用什么样的方式来解决Java包冲突问题呢?
如果你使用的开发工具是IDEA的话,那么解决Java包冲突问题将会变得十分easy,IDEA为我们提供了十分方便的依赖分析工具,废话不多说,让我们先来看看如何使用IDEA提供的依赖分析工具排除冲突的jar包。

查看及排除冲突jar包

  1. 查看冲突jar包
  • 点击右边侧边栏的Maven Projects
  • 选中想要查看的项目,并点击dependencies选项
  • 点击右上方show denpendices选项,或者使用快捷键Ctrl+Shift+Alt+U进行查看
    经过上述三个操作步骤可以清晰的看到当前选中项目的所有jar包依赖情况,如图所示:

标注说明

  • 标注 1:Maven Projects,Maven 项目选项;
  • 标注 2:Dependencies,项目依赖;
  • 标注 3:Show Dependencies,展示项目依赖图;
  • 标注 4:项目jar包依赖关系图。

如上图所示,展示了我们项目的依赖图。但是,依赖图太小了,根本没法看啊?好办,点击鼠标右键,呼出右键菜单栏【在项目依赖图上右键】,然后点击Actual Size,效果图如下所示:

javax.el包冲突 java 如何解决包冲突_java

  1. 排除冲突jar包
    仔细观察上图,会发现在项目依赖图中,有一些红色标记的线,实际上,这些红色标记出来的线所指向的 jar 包,就是项目中冲突的 jar 包!且在我们点击 jar 包之后,还会显示出多条指向 jar 包的红色虚线,其代表着该 jar 包被多次引用,及具体引用路径,如下图所示:

如上图所示,想要排除冲突的 jar 包,其方法为:点击冲突的 jar 包,右键呼出菜单栏,点击Exclude选项。在排除冲突的 jar 包之后,pom.xml文件会自动更新,添加排除语句,如下图所示:

javax.el包冲突 java 如何解决包冲突_java_02

class 加载顺序查看

在实际项目开发过程中,一旦遇到jar包冲突时,最难的往往不是如何排除冲突jar包,而是知道当前项目需要使用哪一个jar包和当前项目正在使用的jar包是哪一个,在这里介绍一个jvm自带的工具类,当虚拟机报告类找不到或类冲突时可用工具类来诊断来查看虚拟机的类加载情况。这个工具类就是:
java -verbose:class

在程序运行的时候有多少类被加载,你可以用verbose:class来监视,在命令行输入java -verbose:class XXX (XXX为程序名,如:java -verbose:class -jar datax-web-1.0.0.jar)你会在控制台看到加载的类的情况。verboseverbose:class含义相同,输出虚拟机装入的类的信息,显示的信息格式如下:

javax.el包冲突 java 如何解决包冲突_jar_03

通过java -verbose:class命令可以清楚的知道当前项目使用的具体类是哪一个,从而很好的定位问题所在,找到需要排除的冲突jar包。

当然,除了java -verbose:class外,verbose还提供
gcjni参数,分别用来报告虚拟机内存回收情况和native方法调用情况。当内存泄漏或者是native方法调用发生错误时,可以采用这两个参数辅助排查问题。