最近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 问题的更多相关文章

  1. Exception in thread "main" java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V

    在学习CGlib动态代理时,遇到如下错误: Exception in thread "main" java.lang.NoSuchMethodError: org.objectwe ...

  2. 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 ...

  3. 【原】tomcat 7 启动报错:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getSessionCookieConfig()Ljavax/servlet/SessionCookieConfig的解决

    现象: tomcat 7 启动报错:java.lang.NoSuchMethodError: javax.servlet.ServletContext.getSessionCookieConfig() ...

  4. java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.isAsyncStarted()Z 的解决

    jetty 9 嵌入式开发时,启动正常,但是页面一浏览就报错如下: java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest ...

  5. java.lang.NoSuchMethodError:

    Servlet.service() for servlet [springMVC] in context with path [/mobile] threw exception [Handler pr ...

  6. 关于java.lang.NoSuchMethodError: android.widget.RelativeLayout.setBackground的解决办法

    今天用一个安卓4.0.4版本的手机测试手上的项目,发现logcat弹出这样一个提示“java.lang.NoSuchMethodError: android.widget.RelativeLayout ...

  7. 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 ...

  8. 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 ...

  9. Caused by: java.lang.NoSuchMethodError: javax.persistence.spi.PersistenceUnitInfo.getValidationMode

    进行 spring mvc jpa整合时.Junit方法测试时. 异常: org.springframework.beans.factory.BeanCreationException: Error ...

  10. 转:Caused by: java.lang.NoSuchMethodError: org.apache.log4j.Category.log

    Caused by: java.lang.NoSuchMethodError: org.apache.log4j.Category.log出现的异常:java.lang.reflect.Invocat ...

随机推荐

  1. SpringBatch框架简介

    概观 轻量级,全面的批处理框架,旨在开发对企业系统日常运营至关重要的强大批处理应用程序. Spring Batch提供了可重复使用的功能,这些功能对于处理大量记录至关重要,包括记录/跟踪,事务管理,作 ...

  2. 关于MySQL中的8个 character_set 变量

    https://blog.csdn.net/sun8112133/article/details/79921734 本篇会简单介绍在 MySQL 中关于 8个 character_set 变量的基本作 ...

  3. python从爬虫基础到爬取网络小说实例

    一.爬虫基础 1.1 requests类 1.1.1 request的7个方法 requests.request() 实例化一个对象,拥有以下方法 requests.get(url, *args) r ...

  4. Ansible------常用功能

    local_action Ansible 默认只会对控制机器执行操作,但如果在这个过程中需要在 Ansible 本机执行操作就需要使用到local_action become:True Ansible ...

  5. Java正则表达式应用

    查找html中的图片 import java.util.regex.Matcher; import java.util.regex.Pattern; public class PicDownload ...

  6. greenplum加密

    --如下为greenplum5.0数据库加解密--加密函数select encrypt('123456','aa','aes');--加解密函数select convert_from(decrypt( ...

  7. centos查看系统/硬件信息及运维常用命令

    [root@yan-001 ~] # uname -a # 查看内核/操作系统/CPU信息的linux系统信息命令 [root@yan-001 ~] # head -n 1 /etc/issue # ...

  8. vba 读取数据库

    1.安装数据库 2.创建数据源 Private Sub Worksheet_Change(ByVal Target As Range) Then Call mySQL End If End Sub P ...

  9. 使用navicat连接 mysql时出现client does not support auth...upgrading Mysql Client

    问题报错:使用navicat时发现出现如下情况: 原因:发现是由于navicat版本的问题,出现连接失败的原因:mysql8 之前的版本中加密规则是mysql_native_password,而在my ...

  10. pycharm中replace的应用

    name = "sucanji" v = name.replace("s","L") print(v) #输出结果就是把sucanji中的s ...