在运行一个程序时,出现了如下错误,且编译器没有出现红框,也就是传说中的NoSuchMethodError

由图中可以知道RegularExpression 有一构造方法RegularExpression(String a ,Sting b, Local local) 被调用啦,但我们提供的RegularExpression ,没有这个构造方法; 但根据名字我找到了JAR包xercesImpl.jar ,且找到了它的构造方法

如图所示,郁闷,这不是有吗。 只能是JAR包冲突啦,在忙忙JAR包中如何去定位这个冲突的JAR包呢。 不会要我每个包都去检查一遍吧,好吧,我承认我是个屌丝,在百度无门与问领导失败的情况下,白痴的这么做个
前段时间看JAVA深度历险时看到了个VERBOSE参数。我想到了它
解释下verbose,加上此参数,它会打印出所有当你使用时需要使用到的CLASS文件
java -verbose Test
这样,我们就看到类的加载过程

在前面的几行中,我们发现org.apache.xerces.impl这PACKAGE 主要来自xercesImpl.jar.
在第七行中,我们看到了org.apache.xerces.impl.xpath.regex.RegularExpression 来自xsdlib-20032005.jar
这样,我们就成功找到了这个冲突的JAR包,果不其然,其中没有此RegularExpression(String a ,Sting b, Local local)构造函数
这样我们移除此JAR的相关CLASS就可以解决这问题啦
这里给了我们些提示的东西。。我们应该可以做一个去检测JAR包的工具,本人的对相关的API不是很熟,只能想到个笨的方法。就是解压所有到JAR,读取目录,组装类名,存到集合中,进行比较。如有大神有更好的建义,请指导。
本文介绍了如何使用verbose参数解决NoSuchMethodError问题,通过打印类加载过程来定位冲突的JAR包。具体步骤包括在命令行加入verbose参数执行程序,观察类加载过程,识别冲突的JAR包,并最终移除该包解决错误。

2万+

被折叠的 条评论
为什么被折叠?



