最近接手新项目,项目一跑,NoSuchMethodError蹦出来了,好不容易解决了,换一个电脑,NoSuchMethodError又蹦出来了,干脆,总结下遇到NoSuchMethodError应该如何应对的思路。

  通过下面的通用思路,可以在不必了解业务的情况下,尽可能解决这个报错。

  下面演示下如何在啥都不知道的情况下遇到该错误的解决思路:

  随便找一个错误示例

Caused by: java.lang.NoSuchMethodError: org.eclipse.jdt.internal.compiler.Compiler.<init>(Lorg/eclipse/jdt/internal/compiler/env/INameEnvironment;Lorg/eclipse/jdt/internal/compiler/IErrorHandlingPolicy;Lorg/eclipse/jdt/internal/compiler/impl/CompilerOptions;Lorg/eclipse/jdt/internal/compiler/ICompilerRequestor;Lorg/eclipse/jdt/internal/compiler/IProblemFactory;)Vat com.taobao.sketch.compile.Compiler.generateClass(Compiler.java:392)at com.taobao.sketch.compile.Compiler.compile(Compiler.java:38)at com.taobao.sketch.compile.SketchCompilationContext.globalVmCompile(SketchCompilationContext.java:403)at com.taobao.sketch.runtime.SketchRuntimeServer.getGlobalVmTemplate(SketchRuntimeServer.java:622)at com.taobao.sketch.runtime.SketchRuntimeServer.resolveGloabalVm(SketchRuntimeServer.java:136)at com.taobao.sketch.runtime.SketchRuntimeServer.initializeVmLibrary(SketchRuntimeServer.java:127)at com.taobao.sketch.runtime.SketchRuntimeServer.init(SketchRuntimeServer.java:96)at com.taobao.sketch.SketchEngine.init(SketchEngine.java:66)at com.taobao.sketch.service.impl.SketchEngineImpl.init(SketchEngineImpl.java:118)at com.alibaba.citrus.springext.support.BeanSupport.afterPropertiesSet(BeanSupport.java:80)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1369)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1335)... 39 more

  这是一个webx框架下的javaweb项目,在启动jetty服务器时报的错。一开始看时看到报错,内心是奔溃的,刚接手项目,以前代码又不是我写的,我怎么知道会报找不到方法的是什么原因引起的啊。别急,先看引起这个错误有可能的原因是什么。

  错误可能的原因

  1. 有这个类,该类真的没有这个方法
  2. 有这个类,而且有好几个,他们之间发生了冲突

  原因排除

  1、点击进入报错的代码所在行,在报错的地方打一个debug点,重行启动项目或重现该错误,让程序运行到该行代码:

     

    

  2、打开display界面(若没有,请在window--show view里面找出该界面),

  手动敲出xxx.class.getProtectionDomain().getCodeSource(),xxx为报错的类的全类名,鼠标选中该行代码,点击界面右上角的J图标,即会打印出到该类对应的包所在的地址。如下图所示。  

  可以看到,结果为:

  (java.security.CodeSource) (file:/D:/Program%20Files%20(x86)/eclipse/configuration/org.eclipse.osgi/843/0/.cp/lib/core-3.1.1.jar <no signer certificates>)

  3、接着复制该类的全类名,快捷键Ctrl+Shift+T打开open type界面,查看我们的项目引用到的包中,哪些有这个类:

  

  我们发现有两个包中有org.eclipse.jdt.internal.compiler.Compiler这个类,分别为:

  包一:ecj.3.5.1.jar

  包二:core-3.1.1.jar

  地址分别为:

  

  但我们发现,刚刚在display中,我们看到的地址,居然不是来自这上面两个地址(上面两个包的地址都在C盘,DEBUG中的包来自D盘),也就是说,实现运行环境引入的包,并不是在我们自己项目中配置的,因为open typy只能找到自己项目中配的东西。

  那么D盘的这个包,在什么地方引入的呢?

  想想,这个错误是在项目启动时报的,那么除了项目,还有“服务器”可能会引入其他包,那么有没有可能是服务器帮我们引入呢?

  4、打开服务器的Classpath,可以找到服务器确实引入了这个包

  

  那么我们在服务器的classpath中把这个包“remove”掉。

  5、再次重新启动项目,dubug、卡点、display,这次结果如下:

  发现:实际环境中,现在己经没有引入D盘那个core-3.1.1.jar包了。我们让项目运行下去,发现还是报同样的错——找不到方法。那么接下来我们让项目引用ecj.3.5.1.jar这个包试试。

  6、ctrl+shift+T、双击进入core-3.1.1.jar中Compiler类所在的目录结构:

   

  提示:左边栏勾上这个标志,即可展开该包所在的目录:

  

  

  同理,打开ecj.3.5.1.jar中Compiler类所在的目录结构。

  最后发现,这个jar包都同一个项目下面,而且两个包都有Compiler类,且排在前面的是core-3.1.1.jar,但是core-3.1.1.jar的Compiler类并没有我们想要的方法,所以报错了。但是eclipse在找类的时候,只要按顺序找到一个,就不会往下找了,所以排在下面的ecj-3.5.1.jar并不会被找到,即使里面有Compiler这个类,且有我们想要的方法。

  7、排除core-3.1.1.jar包:

  该项目是maven项目。我们尝试直接在该项目的pom.xml中搜索core这个包是搜索不到的,那么这个core-3.1.1包可能是因为本项目引入其他项目,而其他项目引入core-3.1.1.jar,所以本项目间接把该包引过来了。

  同时,因为该项目是maven项目,可以通过以下该方法排除这个包:

  

  排除后,该项目的pom.xml变成:

  

  假如是非maven项目,那么可以直接从lib中除去该包,或从项目根目录下面打开.classpath文件,找到对应的包的配置,删除该行即可。

  通过该pom.xml我们可以知道,之所以会产生jar包冲突,原因有两个:

  1、 本项目A本身引用了ecj-3.5.1.jar包,同时引入了项目B,而项目B引入了core-3.1.1.jar,所以本项目也相当于引入了core-3.1.1.jar,这就是maven项目中常见的jar包冲突。

  2、 那为什么maven没有自动帮我们解决jar包冲突呢,那是因为ecj-3.5.1.jar包和core-3.1.1.jar包的groupId和artifactId都不一样,所以maven认为这是两个jar包,并不冲突,解决的办法就是像上面那样,加入exclusions排除。所以我们在开发一个组件的时候,起名字是一个很重要的问题,如果升级组件连名字也改了,用户会产生很大的不方便。

  再次启动项目,问题解决。

转载于:https://www.cnblogs.com/jpfss/p/9101570.html

java--遇到NoSuchMethodError通用解决思路相关推荐

  1. java.lang.NoSuchMethodError的解决办法

    运行代码的时候,出现了java.lang.NoSuchMethodError错误: D/AndroidRuntime(10278): Shutting down VM E/AndroidRuntime ...

  2. java下载网络中的文件,java下载网络文件解决思路

    java下载网络文件 下面这段代码是下载一个http网络文件的代码,但有时候下载下来的图片是完整的,有时候下载下来的不完整,还有下载的ppt,pdf之类,也是打不开的.请大件们给指导一下,小弟感激不尽 ...

  3. java.lang.NoSuchMethodError问题解决

    最近做系统版本迭代是时候,报java.lang.NoSuchMethodError(使用spring boot框架) Exception in thread"main" java. ...

  4. 使用Selenium破解滑动验证码的原理及解决思路

    介绍 现在出现了一种通过用户鼠标移动滑块来填补有缺口图片的验证码,我们叫做滑动验证码. 它的原理很简单,首先生成一张图片,然后随机挖去一块,在页面展示被挖去部分的图片,再通过js获取用户滑动距离,以及 ...

  5. java精确除法计算,四舍五入 Java问题通用解决代码

    java精确除法计算,四舍五入 Java问题通用解决代码 参考文章: (1)java精确除法计算,四舍五入 Java问题通用解决代码 (2)https://www.cnblogs.com/svenne ...

  6. Java Lambda表达式forEach无法跳出循环的解决思路

    Java Lambda表达式forEach无法跳出循环的解决思路 如果你使用过forEach方法来遍历集合,你会发现在lambda表达式中的return并不会终止循环,这是由于lambda的底层实现导 ...

  7. 使用RNN解决NLP中序列标注问题的通用优化思路

    /* 版权声明:可以任意转载,转载时请标明文章原始出处和作者信息 .*/ author: 张俊林 (想更系统地学习深度学习知识?请参考:深度学习枕边书) 序列标注问题应该说是自然语言处理中最常见的问题 ...

  8. java.lang.NoSuchMethodError: scala.Predef$.refArrayOps([Ljava/lang/Object;)[Ljava/lang/Object解决

    完整报错如下: 19/05/15 15:26:10 WARN BLAS: Failed to load implementation from: com.github.fommil.netlib.Na ...

  9. Android之解决java.lang.NoSuchMethodError:android.os.powerManager.isInteractive问题

    1.问题 再三星平板(Android 4.2.2系统)我们代码powerManager调用了函数isInteractive方法,出现下面错误     java.lang.NoSuchMethodErr ...

最新文章

  1. 微信小程序----调用用户信息
  2. 世界最优秀的分布式文件系统架构演进之路
  3. 每瓶汽水一元,两个空瓶可以置换一瓶汽水,现有N元,最多能喝多少瓶?
  4. 怎么快速掌握一门新技术
  5. “主要的编程范型”及其语言特性关系(多图)
  6. web服务器-Apache
  7. python写进程_将数据作为后台进程在Python中写入磁盘
  8. vb6.0企业版win7_比win7更快?官方精简win10:3G+不更新,旧电脑福音
  9. ios pull代码不提示成功_pullRefresh ios版问题 跪求大神帮助啊
  10. 数据结构 2-2 线性表的顺序表实现
  11. GRE改革预测及应对剖析
  12. 欧拉坐标与拉格朗日坐标
  13. ip查看服务器信息,如何查看服务器的出口ip地址
  14. laravel异常前后端独立返回 阿星小栈
  15. 《“ 追梦人” 的逐梦路:探寻大学生创客群体的发展之道》
  16. LC振荡电路 频域计算
  17. 深入理解JVM一之解析class文件
  18. 防范ARP欺骗病毒攻击
  19. 中醫秘笈大公開---家家必備十良方
  20. python一个tab键是几个空格_python中tab键是什么意思

热门文章

  1. 重庆大学 计算机组成原理,计算机组成原理课程设计报告重庆大学
  2. 转载 英语一千句
  3. 【SemiDrive源码分析】【X9芯片启动流程】20 - MailBox 核间通信机制介绍(代码分析篇)之 MailBox for RTOS 篇
  4. 9 项目资源管理 人人都是项目经理系列(第9/13篇)
  5. 使用化学烧伤创建自定义的详细木材燃烧图案
  6. 字符串题目:重新排列字符串
  7. 【Python语言基础】——Python Casting
  8. 非线性最小二乘法之Gauss Newton、L-M、Dog-Leg
  9. 互联网史-chinaren与校内
  10. 通过mac地址查找PC位于那个接入层交换机上