HMCL报错:java.lang1700.NoSuchMethodError

回顾《深入理解jvm》里面关于字节描述符的知识我们知道错误信息提示的是需要找

说明编译时和运行时采用了不一样的jar . 

再通过maven依赖树,查询到org.slf4j.slf4j-api-1.5.6.jar是被一个单点登录的jar依赖间接引入的于是在父工程里面排除掉

 
 
 
 
 
 

回顾整个问题的解决过程,发现这次解决问题是采用 源码分析+maven依赖树的静态分析方法我们有什么办法知道有问题的Class文件是jvm加载的哪个jar的么?





在这个临时日志中我们找到了

说明运行时的确是使用到了slf4j-1.5.6版本的Jar包,和编译classpath使用的jar包版本不一致

阿里的聚石写了一个housemd的工具 ,安装方法可以点击这里() , 启动后运行如下命令attach到tomcat进程:


要自己实现的话比如我们要获取一个Test.class类是被哪個jar导入的,可以这样


另外还可以用loaded -h 命令查看类加载器树,

要自己实现的话可以这样:



那么我们能否在应用打包的时候就分析出存在jar冲突的地方呢 ?我的思路是这样的:
1、在应用打包成功以后把应用的class的jar包拷贝到一个临时文件夹。
2、对这些jar包中的字节码文件做如下操莋:


3)输出jar冲突信息到控制台。
目前我已经在本机mac环境下实现了基本功能, 接下来的计划是做成maven插件放到整个maven应用的build cycle中去。
}

我要回帖

更多关于 java.lang 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信