Exception in thread "main" java.lang.NoSuchMethodError

时间:2022-10-11 23:15:00

今天编程又碰到了这个异常。以前碰到了也很少总结,今天就来说一下这个异常发生的几种情况:

(1).第一个常见原因jar包中确实没有这个方法,所以虚拟机根本没有加载这个方法。

(2).第二个常见原因是jar包冲突了。导致虚拟机不知道加载哪一个,所以就导致了加载失败,从而找不到这个方法。

(3).第三个,也许就是包含在第二种情况中,该方法只有抽象定义,而没有具体实现。我今天的遇到的是第二种吧。

闲话不说,直接贴出异常:

Exception in thread "main" java.lang.NoSuchMethodError: org.slf4j.spi.LocationAwareLogger.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;[Ljava/lang/Object;Ljava/lang/Throwable;)V
 at org.apache.commons.logging.impl.SLF4JLocationAwareLog.debug(SLF4JLocationAwareLog.java:133)
 at org.apache.http.client.protocol.RequestAuthCache.process(RequestAuthCache.java:76)
 at org.apache.http.protocol.ImmutableHttpProcessor.process(ImmutableHttpProcessor.java:132)
 at org.apache.http.protocol.HttpRequestExecutor.preProcess(HttpRequestExecutor.java:166)
 at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:485)
 at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:882)
 at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
 at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:55)
 at org.apache.solr.client.solrj.impl.HttpSolrClient.executeMethod(HttpSolrClient.java:498)
 at org.apache.solr.client.solrj.impl.HttpSolrClient.request(HttpSolrClient.java:262)
 at org.apache.solr.client.solrj.impl.HttpSolrClient.request(HttpSolrClient.java:251)
 at org.apache.solr.client.solrj.SolrRequest.process(SolrRequest.java:149)
 at org.apache.solr.client.solrj.SolrClient.add(SolrClient.java:106)
 at org.apache.solr.client.solrj.SolrClient.add(SolrClient.java:71)
 at org.apache.solr.client.solrj.SolrClient.add(SolrClient.java:85)
 at com.solr.insertData.InsertProgarm.main(InsertProgarm.java:40)

出现这样的问题,如何去追踪:

(1).当然是看看我们引入的jar包是否有冲突,按快捷键ctrl+shift+T,输入类名,看看工程下面有几个jar包包含该类:

Exception in thread "main" java.lang.NoSuchMethodError

我的工程是solr_web,所以有三个地方出现了org.slf4j.spi.LocationAwareLogger这个类,不过我不知道工程是加载的哪一个?因此使用下面的语句来查询工程实际加载的是哪一个:

URL urlOfClass = InsertProgarm.class.getClassLoader().getResource("org/slf4j/spi/LocationAwareLogger.class"); //InsertProgarm是该语句所在的类
 System.out.println(urlOfClass);

输出结果:

jar:file:/E:/Program%20Files/myeclipse/plugins/com.genuitec.eclipse.j2eedt.core_11.5.0.me201311281640/data/libraryset/EE_6/bean-validator.jar!/org/slf4j/spi/LocationAwareLogger.class

因此加载的是myeclipse自带的包,去反编译下这个包:

Exception in thread "main" java.lang.NoSuchMethodError

这个jar包里有对该接口的实现,所以这个还是jar包冲突了。

我这里去掉了myeclipse自带的jar包。选中你的项目(我这里是solr_web),右键-->properties-->Java Build Path,修改JavaEE6.0 Gerneric Library,去掉MyEclipse自带的冲突jar

Exception in thread "main" java.lang.NoSuchMethodError

确定修改,重新运行,OK!