NoSuchMethodError 问题
最近maven升级到gradle后,总是报NoSuchMethod error。然后 ,报错的类确实是有这个方法,一切看起来都没有问题。那么运行时jvm到底加载的哪里的类呢?有没有相关的命令可以查询,答案是有的:
1)方法1:
jvm里面有一个跟踪classload的参数:
-XX:+TraceClassLoading
可以看到运行时加载的类,然后,找到这个类反编译,发现确实没有这个方法。
2)方法2:
阿里的聚石写了一个housemd的工具 ,安装方法可以点击这里(https://github.com/CSUG/HouseMD) , 启动后运行如下命令attach到tomcat进程:
housemd `jps|grep Bootstrap|awk '{print $1}'`
然后loaded classname 就可以得到运行时类所在的jar .
要自己实现的话,比如我们要获取一个Test.class类是被哪个jar导入的,可以这样
URL url = Log.class.getClassLoader().getResource("Test.class");
url.getFile();
另外,还可以用loaded -h 命令查看类加载器树,
、
要自己实现的话可以这样:
for(ClassLoader cl = Log.class.getClassLoader(); cl != null ; cl = cl.getParent()){
System.out.println(cl.getName());
}
那么我们能否在应用打包的时候,就分析出存在jar冲突的地方呢 ?我的思路是这样的:
1、在应用打包成功以后,把应用的class的jar包拷贝到一个临时文件夹。
2、对这些jar包中的字节码文件,做如下操作:
1)使用asm分析出class 导入的class .
2)对每一个导入的class获取 build classpath下的jar列表,如果jar的个数大于等于2 ,则表明有jar冲突。
3)输出jar冲突信息到控制台。
目前,我已经在本机mac环境下实现了基本功能, 接下来的计划是做成maven插件,放到整个maven应用的build cycle中去。
NoSuchMethodError 问题的更多相关文章
- Exception in thread "main" java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V
在学习CGlib动态代理时,遇到如下错误: Exception in thread "main" java.lang.NoSuchMethodError: org.objectwe ...
- java.lang.NoSuchMethodError: org.apache.tomcat.util.res.StringManager.getManager(Ljava/lang/Class;)Lorg/apache/tomcat/util/res/StringManager
问题: 使用Springboot打包为war部署于Tomcat7中报错 java.lang.NoSuchMethodError: org.apache.tomcat.util.res.StringMa ...
- 【原】tomcat 7 启动报错:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getSessionCookieConfig()Ljavax/servlet/SessionCookieConfig的解决
现象: tomcat 7 启动报错:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getSessionCookieConfig() ...
- java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.isAsyncStarted()Z 的解决
jetty 9 嵌入式开发时,启动正常,但是页面一浏览就报错如下: java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest ...
- java.lang.NoSuchMethodError:
Servlet.service() for servlet [springMVC] in context with path [/mobile] threw exception [Handler pr ...
- 关于java.lang.NoSuchMethodError: android.widget.RelativeLayout.setBackground的解决办法
今天用一个安卓4.0.4版本的手机测试手上的项目,发现logcat弹出这样一个提示“java.lang.NoSuchMethodError: android.widget.RelativeLayout ...
- hive 使用where条件报错 java.lang.NoSuchMethodError: org.apache.hadoop.hive.ql.ppd.ExprWalkerInfo.getConvertedNode
hadoop 版本 2.6.0 hive版本 1.1.1 错误: java.lang.NoSuchMethodError: org.apache.hadoop.hive.ql.ppd.ExprWalk ...
- tomcat7 启动项目报错 java.lang.NoSuchMethodError: javax.servlet.ServletContext.getSessionCookieConfig()
JDK版本:jdk1.8.0_77 Tomcat 版本:apache-tomcat-7.0.47 异常重现步骤: 1.完成项目部署 2.启动Tomcat 异常头部信息:java.lang.NoSuch ...
- Caused by: java.lang.NoSuchMethodError: javax.persistence.spi.PersistenceUnitInfo.getValidationMode
进行 spring mvc jpa整合时.Junit方法测试时. 异常: org.springframework.beans.factory.BeanCreationException: Error ...
- 转:Caused by: java.lang.NoSuchMethodError: org.apache.log4j.Category.log
Caused by: java.lang.NoSuchMethodError: org.apache.log4j.Category.log出现的异常:java.lang.reflect.Invocat ...
随机推荐
- 关于MySQL中的8个 character_set 变量
https://blog.csdn.net/sun8112133/article/details/79921734 本篇会简单介绍在 MySQL 中关于 8个 character_set 变量的基本作 ...
- 激活函数——tanh函数(理解)
0 - 定义 $tanh$是双曲函数中的一个,$tanh()$为双曲正切.在数学中,双曲正切“$tanh$”是由基本双曲函数双曲正弦和双曲余弦推导而来. $$tanhx=\frac{sinhx}{co ...
- jmeter接口入门操作手册
基础操作手册:Windows Mr丶菜鸟 1.下载jmeter ,jmeter是一款基于java的开源工具,可以测试接口和性能,需要jdk环境,下载jmeter地址:https://jmeter.a ...
- nginx php-fpm开启session
一. 权限问题,这个是发生在多数情况下 找到php session目录设置给 nginx 或者 apache最大权限 二. 配置问题按如下就没啥问题了 [Session] session.save ...
- 【easy】110. Balanced Binary Tree判断二叉树是否平衡
判断二叉树是否平衡 a height-balanced binary tree is defined as a binary tree in which the depth of the two su ...
- Linux su切换用户后命令提示符变为bash-4.2$
2018-9-30 19:31:41 星期日 今天遇到一个问题, 给gitlab配置webhook的时候, 一个目录总是不能正确执行git pull 命令, 无任何输出, 根据之前经验, 感觉是权限的 ...
- 布思算法Java实现
public String multiply(String Q,String M){ char Q0 = '0'; String A = get01(Q.length(),"0") ...
- ubuntu服务器上提示 To run a command as administrator (user "root"), use "sudo <command>". See " 解决方案
原因是你执行命令必须要在root用户下执行.其他用户权限不够.运行 sudo -s 切换到root用户下就可以了
- Windows Internals 笔记——进程的权限
1.大多数用户都用一个管理员账户来登录Windows,在Vista之前,这样的登录会创建一个安全令牌.每当有代码试图使用一个受保护的安全资源时,操作系统就会出示这个令牌.从包括Windows资源管理器 ...
- java 小程序开发PKCS7Padding 解密方法实现,以及错误Cannot find any provider supporting AES/CBC/PKCS7Padding 解决办法
近日在对接小程序API,其中wx.getUserInfo api返回的数据encryptedData 的解密算法要求为: AES-128-CBC,数据采用PKCS#7填充. 经过一番查询,得到java ...