Arthas 实战,助你解决同名类依赖冲突问题(下)

使用 verbose:class 打印加载类

我们可以在 jvm 启动脚本加入如下参数 -verbose:class,然后重启,日志里会打印出每个类的加载信息。

1java -verbose:class -classpath './*' xx.xx.Main

日志输出如下:

Arthas 实战,助你解决同名类依赖冲突问题(下)

通过这种方式可以看到加载类来源于哪个Jar包。

不过这种方式需要重启应用,对生产系统来说,影响还是比较大,不太优雅。

Arthas 查到来源类

阿里开源项目 Arthas  sc 命令可以用来查找加载类的信息。。

sc 命令是 Search-Class 简写,这个命令可以搜索出已经加载到 JVM 中的 Class 信息,支持参数如下表格所示。

Arthas 实战,助你解决同名类依赖冲突问题(下)

使用方法非常简单,程序启动之后,启动 arthas,进入 A 应用。

运行如下命令:

1sc -d org.example.App

输出结果如下 :

Arthas 实战,助你解决同名类依赖冲突问题(下)

code-source 显示当前查找类 org.example.App 来自的 C。

另外我们可以 jad 命令反编译类,在线查看源码。

Arthas 实战,助你解决同名类依赖冲突问题(下)

总结

这篇文章主要解释应用中存在多个同名类的情况下,加载类不同的原因。接着介绍了两种快速查找运行应用依赖类来源的方法。

当定位到了冲突类的来源,我们可以显示使用 classpath 排列 jar 包顺序,指定类加载的顺序。但这只是暂时解决,本质依赖冲突的问题,还是深层次排除的。

上一篇:scikit-learn 逻辑回归类库使用小结


下一篇:findContours:ValueError: too many values to unpack (expected 2)