问题

相信大家在开发过程中一定经常遇到此类报错 : Caused by: java.lang.NoSuchMethodError 。
因此今天总结特地做个总结,希望能够解决此类问题,而不是这一个问题。
下面以我遇到的一个报错为例,说一下我对此类问题的解决方法 。
今天在升级了 Spring 版本之后,启动 Tomcat 报错,报错见下 :


日志

[Loaded javax.servlet.ServletContextEvent from file:/D:/apache-tomcat-8.5.34/lib/servlet-api.jar] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)at com.sun.jmx.remote.security.MBeanServerAccessController.invoke(MBeanServerAccessController.java:468)at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468)at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)at java.security.AccessController.doPrivileged(Native Method)at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1408)at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357)at sun.rmi.transport.Transport$1.run(Transport.java:200)at sun.rmi.transport.Transport$1.run(Transport.java:197)at java.security.AccessController.doPrivileged(Native Method)at sun.rmi.transport.Transport.serviceCall(Transport.java:196)at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:573)at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:834)at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)at java.security.AccessController.doPrivileged(Native Method)at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)at java.lang.Thread.run(Thread.java:748)Caused by: java.lang.NoSuchMethodError: org.springframework.util.ReflectionUtils.accessibleConstructor(Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/reflect/Constructor;at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:154)... 46 more

查找问题

首先我们需要确定项目使用的是哪个 jar 包 。以 IntelliJ IDEA 为例 :

tomcat 启动的时候添加 jvm 参数 “-XX:+TraceClassLoading” , 操作如下图 :

配置之后,重启 tomcat ,控制台除了打印输出错误日志以外,还可以看到使用的 jar 包 :

看到以上错误输出是使用了 spring-core-3.2.10 版本的 jar 包导致的 。
因此问题为转换为: 在spring-core-3.2.10 jar 中的 ReflectionUtils 类里没有找到 accessibleConstructor 方法。
在工程里搜索 ReflectionUtils,如下图:

我们看到工程里有两个 ReflectionUtils ,一个是 spring-core-3.2.10 ,另一个是 spring-core-5.1.5 版本,分别进入这两个类,发现在 spring-core-5.15 中有 accessibleConstructor 方法,而 spring-core-3.2.10 中没有 accessibleConstructor 方法。

通过以上步骤初步得出结论,项目同时依赖了 spring-core-3.2.10 和 spring-core-5.1.5 。 IDE 在编译时使用了低版本的 spring-core-3.2.10 jar 包,而 jar 中没有accessibleConstructor 方法,因此抛出了 NoSuchMethodError 异常。


分析依赖树

接下来继续分析是 哪些项目依赖了 spring-core-3.2.10 和 spring-core-5.1.5 ? 是自己的工程还是引用的第三方工程依赖的呢 ?因此问题转换为分析依赖关系。
如果项目依赖较简单,可以直接在 IDEA 右侧找到依赖树, 如果是使用 Gradle 构建项目就点击 Gradle, 如果是 Maven 构建项目就点击 Maven 。

下图中左侧有箭头的含义是这个库引用了其他 jar 包,可以点击箭头展开。

这样看的比较直观,但是有个缺点,一个大工程所依赖的 jar 包可能是几十或上百个的。因此,有时我们需要通过命令行分析依赖树,以下分析依赖树以 Gradle 为例 :
如果项目简单,仅仅有一个工程,没有依赖其他 moudle ,
进入工程 build.gradle 所在目录,执行以下命令。

gradlew dependencies

在控制台可以到整个项目的依赖树,如下图:

如果工程比较庞大,依赖了很多 module ,仅仅想分析某一 module 的依赖 :

gradlew   :submoduleName:dependencies  >  dependencies.log

其中 > dependencies.log 是将日志导出到命令执行目录的 dependencies.log 中,原因是因为有时候 console 中日志太多,console 无法跳的太快,无法全部分析,因此导入到文件中。分析出的依赖树如下:

可以看到 org.springframework:spring-core:5.1.5.RELEASE 被 3.2.10.RELEASE 覆盖 ,因此会报 Caused by: java.lang.NoSuchMethodError 的错 。

问题找到了,那么解决就很简单了。


总结

整个问题的分析过程到此结束,解决问题的方案无非下面两种:

  1. 去除不必要的依赖
  2. 统一使用的版本号
    因为我使用的是 Gradle ,因此使用的命令就是 force 或 exclude 。 如果对这两个命令不熟悉, 可参考下我以前的一篇 文章。
    如果你使用的 Maven , 分析问题的步骤大致相同,因为我对 Maven 不太熟悉,不在此赘述。

Caused by : java.lang.NoSuchMethodError相关推荐

  1. 日常问题——flume连接hive时报错Caused by: java.lang.NoSuchMethodError

    问题描述: 今天新安装的flume,使用flume来做kafka与hive对接时出现了以下两个的错误: Caused by: org.apache.hive.hcatalog.streaming.Co ...

  2. 异常:Caused by: java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()Z

    Spring3.0 + Hibernate3.5: 启动服务器报: Caused by: java.lang.NoSuchMethodError: javax.persistence.OneToMan ...

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

    # 1.概述 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entit ...

  4. Caused by: java.lang.NoSuchMethodError:No virtual method isSuccess()Z in class Lretrofit2/Response;

    异常: Caused by: java.lang.NoSuchMethodError: No virtual method isSuccess()Z in class Lretrofit2/Respo ...

  5. maven中如何解决jar包的依赖冲突Caused by:java.lang.NoSuchMethodError Caused by: java.lang.ClassNotFoundException

    产生jar包依赖冲突的原因: 假如在一个项目中,如项目demo中,我们即引入了aaa.jar又引入了bbb.jar,但是这两个jar包同时又引入了传递依赖xxx.jar,不同的是aaa.jar和bbb ...

  6. Caused by: java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()Z

    这个异常是在我们配置spring + hibernate annotations的@OneToMany 一对多双向关联后出现的异常. java.lang.NoSuchMethodError: java ...

  7. hive执行drop卡死一例:java.lang.NoSuchMethodError: org.apache.commons.lang3.StringUtils.isAnyBlank

    环境: 组件 版本 Hadoop 3.1.2 Hive 2.3.4 故障复现操作: hive中尝试drop table卡死,然后去hadoop的yarn界面发现如下报错 完整报错: org.apach ...

  8. 报此错错解决办法:java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()Z

    java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()Z 的解决方式 Caused by: java.lang ...

  9. java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/Str

    解决方案: java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/la ...

  10. Factory method ‘sqlSessionFactory‘ threw exception; nested exception is java.lang.NoSuchMethodError:

    springboot 引入mybatis-plus后报错: Factory method 'sqlSessionFactory' threw exception; nested exception i ...

最新文章

  1. Android PC投屏简单尝试—最终章1
  2. 从厕所排队引发的产品设计方案思考
  3. ntop linux,linux下安装ntop
  4. DelphiMVC连接池配置
  5. 记录在Ubuntu 18.04系统中安装Apache, MySQL和PHP环境
  6. Linux服务器傻瓜安装(图解下)(4)
  7. Golang Web应用 创建docker镜像笔记(win 平台)
  8. 如何在Mac的内置词典中添加和删除单词
  9. Hive:动静态分区
  10. 《概率论与数理统计》(浙大第四版)第一章总结笔记(纯手写)
  11. 【模板】吉司机线段树(势能线段树)
  12. 第十二章(项目采购管理)知识点
  13. Python 生成一组随机数列表
  14. (C语言之复习demo_10-自我复习使用-可供参考)_if 的四种句型深入解析,附带集合文氏图详解
  15. Adobe Illustrator Mac使用教程
  16. 计算机二级的Word知识点,计算机等级考试二级office基础知识点总结.doc
  17. 基于tkinter库txt文件操作的Python界面化图书管理系统
  18. 如何相对高效解决代码测评、训练过程中遇到的 Bug
  19. IntelliJ IDEA 2021 主题 图标 这样配置 ,让你的IDEA好看到爆炸!
  20. [OpenGL]变量限定符-参数限定符-精度限定符

热门文章

  1. win10快捷键大全 win10常用快捷键
  2. 2019年京东面试题-洗咖啡杯问题【贪心和动态规划】
  3. LC-3下汇编实现简易版四子棋的游戏
  4. wps excel 表格给一列数据添加相同的内容的方法
  5. win7系统中如何以管理员身份修改hosts文件
  6. 服务器运行时间设置,服务器的时间同步设置方法
  7. android 手机 报证书错误,安卓 ssl证书 安卓ssl证书出现错误的可能原因? - SSL网...
  8. MySQL中的子查询用法
  9. Xenu Link Sleuth
  10. Make sure that `gem install sqlite3 -v '*.*.*'`succeeds before bundling Error: 问题解决