java jar包冲突解决方法

jar包冲突几乎是每一个Java程序员都会遇到的问题,并且特别是大工程,jar包各类依赖,常常性发生包冲突。一般会报这样几个运行时异常:java

  • java.lang.NoSuchMehodError
  • java.lang.NoClassDefFoundError

这类问题十有八九都是jar包冲突引发,要解决jar包冲突问题,咱们先了解下致使这个冲突的缘由。程序员

致使jar包冲突的缘由

一、mvn的传递依赖特性:mvn编译打包除了会引入直接申明的依赖,还会引入间接申明的依赖spa

二、mvn的依赖仲裁规则:.net

    1). 按照项目总控POM的DependencyManager版本声明进行仲裁。
    2). 如无仲裁声明,则按照依赖最短路径肯定版本。
    3). 若相同路径,有严格区间限定的版本优先。
    4). 若相同路径,无版本区间,则按照先入为主原则。命令行

三、依赖的scope会影响依赖的影响范围。开发


简单冲突解决的三途径!

一、根据报错的class名或方法名定位到可能致使冲突的jar包,jar包冲突引入有几种状况:get

    1).  引入了这个jar包的多个版本,而mvn仲裁的时候取了错误的版本,这个版本自己就缺乏正确的class或方法。虚拟机

    2).  引入了不一样坐标可是具备同名class的多个jar,mvn加载class的顺序差别会致使加载到错误的class。io

二、经过mvn dependency:tree  >  tree.txt 导出所有的依赖。 可使用 -Dverbose 、-Dincludes或者-Dexcludes参数来精肯定位致使冲突的jar包。 编译

三、找到须要排除的依赖jar包,经过mvn仲裁优先的方法定义正确的jar包,或者经过exclusion的方式排除错误的jar包。

4.舒适提示:另外在项目开发中jar尽可能按需引入,系统管理起来,别什么都无论直接加包进来,这样也能够在必定程度上减小jar包冲突的风险。

 

 

 

在程序运行的时候究竟会有多少类被加载呢,一个简单程序会加载上百个类的!你能够用verbose:class来监视,在命令行输入java -verbose:class XXX  (XXX为程序名)你会在控制台看到加载的类的状况。

 verbose和verbose:class含义相同,输出虚拟机装入的类的信息,显示的信息格式以下: [Loaded java.io.FilePermission$1 from shared objects file] 当虚拟机报告类找不到或类冲突时可用此参数来诊断来查看虚拟机从装入类的状况。

相关文章
相关标签/搜索