为什么80%的码农都做不了架构师?>>>   

在一次项目启动中,遇到了一个报错

"java.lang.NoSuchMethodError: org.slf4j.spi.LocationAwareLogger.log"

简单Google一下,是jar包冲突的问题。

按照网上的思路,首先查看mvn中冲突的包

使用命令:

mvn dependency:tree -Dverbose | grep "omitted for conflict with”

通常上面的显示的信息非常多,如果已经明确了冲突的包,比如本场景下是log4j/slf4j

使用命令:

mvn dependency:tree -Dverbose -Dincludes=log4j:log4j 

具体查看pom文件,修改冲突的包。

把一些明显的冲突修改了以后,再次启动,仍然报错,报错信息变了:

Exception in thread "main" java.lang.IllegalAccessError: tried to access field
org.slf4j.impl.StaticLoggerBinder.SINGLETON from class org.slf4j.LoggerFactoryat org.slf4j.LoggerFactory.<clinit>(LoggerFactory.java:60)

通过Google找到原因如下:

是由于低版本的slf4j的bug,具体原因查看这个Blog,按理说找到对应的pom配置,升级下version就可以了。

可是我将pom中的slf4j-api和slf4j-log4j12升级到1.7+,仍然报同样的错误。

查看本地M2_REPO,将低版本的slf4j-api和slf4j-log4j12删除,仍然报同样的错。

开始怀疑是从其他jar包中加载了LoggerFactory。

如何查看一个类加载的来源信息呢?

VM的-verbose参数解决了这个问题

-verbose[:class|gc|jni] 在输出设备上显示虚拟机运行信息。

在程序运行的时候有多少类被加载!你可以用verbose:class来监视,在命令行输入java -verbose:class XXX  (XXX为程序名)你会在控制台看到加载的类的情况。

verbose和verbose:class含义相同,输出虚拟机装入的类的信息,显示的信息格式如下:

[Opened D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.Object from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.io.Serializable from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.Comparable from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.CharSequence from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.String from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.reflect.GenericDeclaration from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.reflect.Type from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.reflect.AnnotatedElement from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.Class from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.Cloneable from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.ClassLoader from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.System from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.Throwable from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]

当虚拟机报告类找不到或类冲突时可用此参数来诊断来查看虚拟机从装入类的情况。

在本场景排查问题时,发现类LoggerFactory加载来源于com.springsource.slf4j.api,将对应的jar包移除,问题解决。

值得注意的是,-verbose参数在jvm故障诊断时同样有着重要的作用

java –verbose:gc

在虚拟机发生内存回收时在输出设备显示信息,格式如下:

 [Full GC 256K->160K(124096K), 0.0042708 secs] 

该参数用来监视虚拟机内存回收的情况。

public class JvmVerbose {
/**
* JVM -verbose[:class|gc|jni] 参数测试
* @param args
*/public static void main(String[] args) {JvmVerbose jvmVerbose = new JvmVerbose();System.gc();}
}

在这个例子中,一个新的对象被创建,由于它没有使用,所以该对象迅速地变为可达,程序编译后,执行命令:

java -verbose:gc JvmVerbose

结果:

[GC 647K->256K(124096K), 0.0274253 secs]
[Full GC 256K->160K(124096K), 0.0042708 secs]

箭头前后的数据256K和160K分别表示垃圾收集GC前后所有存活对象使用的内存容量,说明有256K-160K=96K的对象容量被回收,括号内的数据124096K为堆内存的总容量,收集所需要的时间是0.0042708秒(这个时间在每次执行的时候会有所不同)。

java –verbose:jni

-verbose:jni输出native方法调用的相关情况,一般用于诊断jni调用错误信息。

在虚拟机调用native方法时输出设备显示信息,格式如下:

[Dynamic-linking native method java.lang.Object.registerNatives ... JNI] 

该参数用来监视虚拟机调用本地方法的情况,在发生jni错误时可为诊断提供便利。

Reference:

1. https://www.slf4j.org/faq.html

2. http://blog.csdn.net/rommal7090/article/details/4041240

3. http://www.javaranger.com/archives/367#java –verbose:jni

转载于:https://my.oschina.net/hosee/blog/916941

记录一次maven jar包冲突的排查过程相关推荐

  1. 【maven】maven jar 包 冲突 的解决方式

    1.概述 视频参考:maven jar 包 冲突 的解决方式 此处文章参考:Mvn : Maven的依赖管理 依赖冲突 解决思路

  2. maven jar包冲突常见报错及解决方法

    见到如下错误,可以想到是不是jar包冲突 1.java.lang.NoSuchMethodError 2.java.lang.ClassNotFoundException 3.java.lang.No ...

  3. 几个解决 Maven Jar 包冲突的小技巧,太实用了!

    前言 大家在项目中肯定有碰到过Maven的Jar包冲突问题,经常出现的场景为: 本地运行报NoSuchMethodError,ClassNotFoundException.明明在依赖里有这个Jar包啊 ...

  4. IntelliJ IDEA Maven jar包冲突解决,快速发现jar包冲突

    IntelliJ IDEA 自带的Diagrams 去查看jar包冲突相当费劲 ~ ,安装个插件即可快速解决该问题 打开Settings,搜索maven helper,并安装 安装完成后,直接打开po ...

  5. 常用jar包_几个解决 Maven Jar 包冲突的小技巧.

    前言 大家在项目中肯定有碰到过Maven的Jar包冲突问题,经常出现的场景为: 本地运行报NoSuchMethodError,ClassNotFoundException.明明在依赖里有这个Jar包啊 ...

  6. android jar包冲突_用好这几个技巧,解决Maven Jar包冲突易如反掌

    前言 大家在项目中肯定有碰到过Maven的Jar包冲突问题,经常出现的场景为: 本地运行报NoSuchMethodError,ClassNotFoundException.明明在依赖里有这个Jar包啊 ...

  7. Maven Jar包冲突?看看高手是怎么解决的

    接手了一套比较有年代感的系统,计划把重构及遇到的问题写成系列文章,老树发新枝,重温一些实战技术,分享给大家.[重构02篇]:Maven项目Jar包管理机制.冲突解决. 知识背景 Jar包冲突在软件开发 ...

  8. jar包冲突如何排查

    大家在项目中肯定有碰到过Maven的Jar包冲突问题,经常出现的场景为: 项目中运行报NoSuchMethodError,ClassNotFoundException.明明在依赖里有这个Jar包啊.怎 ...

  9. 记录一次解决jar包冲突asposewobfuscated.zz2S->asposewobfuscated.zz2R->asposewobfuscated.zz2S

    目录: 1.结论 2.原因 3.解决方案 4.过程 5.发泄 1.先说结论: 引入了两个版本的:aspose-words,导致启动tomcat时候因循环依赖报了StackOverflowError 2 ...

最新文章

  1. 学习ExtJS4 常用控件
  2. Centos源码安装Cmake
  3. mysql导入导出.sql数据
  4. 2019 Flink Forward 大会最全视频来了!(附PPT下载) | 5大专题不容错过
  5. ShellSort 希尔排序
  6. 从Myeclipe转向Idea,各种遇坑与填坑经验,持续更新(图文)
  7. 十分钟开发一个调用Activity的PhoneGap插件
  8. WinPE启动U盘工具箱 (通用PE工具箱ISO映像文件)
  9. vue3+el-table表格表头增加斜线
  10. 视频转GIF软件哪个好用 怎么将视频转为GIF
  11. 星际2 正在连接服务器,星际征霸游戏连接服务器失败怎么办 解决方案分享
  12. 【Python3之面向对象的程序设计】
  13. 抖音电商的带货情况究竟如何,抖音电商带货前景如何
  14. Python判断一个词语是不是人名
  15. 【矿渣】【玩客云】玩客云驱动OLED屏幕
  16. 输入5个学生某门课程的成绩(用一维数组表示),分别用函数实现下列功能:
  17. 洛谷——B2015 计算并联电阻的阻值(java)
  18. 2022年R2移动式压力容器充装操作证考试题库及模拟考试
  19. 从0开始学习C语言————C语言简介,数据类型及分支语句
  20. EDA开源仿真工具verilator入门5:调试

热门文章

  1. Java全角、半角字符的关系以及转换
  2. [老贴]《asp.net高级编程》读书笔记(2)
  3. Python 小程序(2)
  4. 1048 数字加密 (20 分)java
  5. 死里逃生!国足2:1逆转泰国队晋级亚洲杯八强
  6. Repository 设计模式介绍
  7. windows中使用git和开源中国
  8. Eclipse无法识别(手机)设备的解决方案
  9. Jquery绑定事件(bind和live的区别)[转]
  10. MapInfo中常用查询函数及用法