Spring: java.lang.NoSuchMethodError: clearCache | ClassNotFoundException | Error during artifact deployment 思路及解决办法

前言

一如既往的今天,打算打开WEB项目一如既往地修(写)BUG。就在我运行的时候,弹出了错误:

 1java.lang.NoSuchMethodError: org.springframework.core.ResolvableType.clearCache()
 2	at org.springframework.context.support.AbstractApplicationContext.resetCommonCaches(AbstractApplicationContext.java:873)
 3	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:559)
 4	at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403)
 5	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
 6	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
 7	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4853)
 8	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5314)
 9	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
10	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:753)
11	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:729)
12	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
13	at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1092)
14	at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1834)
15	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
16	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
17	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
18	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
19	at java.lang.Thread.run(Thread.java:745)
 1严重: Error configuring application listener of class org.springframework.web.util.Log4jConfigListener
 2java.lang.ClassNotFoundException: org.springframework.web.util.Log4jConfigListener
 3	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1702)
 4	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547)
 5	at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:532)
 6	at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:514)
 7	at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:142)
 8	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4854)
 9	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5434)
10	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
11	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
12	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
13	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
14	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
15	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
16	at java.lang.Thread.run(Thread.java:745)

马鸭,昨天还能完完整整的运行,今天咋就废了?

解决思路

小提示:如果你使用IDEA,Tomcat提示Error during artifact deployment,你可以在Tomcat Localhost Log查看错误日志:

8.png

在各种翻找和思考后,我尝试了以下几种办法:

下方都有可能是导致出现该问题的解决方案,每个解决方案不能保证解决问题,但我建议在备份后多做尝试。

1)代码出错

出现问题可能是由于你的注解使用不遵循语法导致的,而IDE无法检测部分注解的正确性。

引用自https://blog.csdn.net/x_iya/article/details/54234665

1@WebServlet(name = "testServlet", urlPatterns = {"test.do"})

上面这段代码的urlPatterns赋值不符合要求,应修改为:

1@WebServlet(name = "testServlet", urlPatterns = "test.do")

不过在我与上一正常比对后确认,我的语法符合要求。

2)Rebuild

在IDEA中,默认不会将所有文件重新编译一次,而是只编译检测到修改的文件。但有时也会出现BUG,尝试Build - Rebuild Project来解决。

在尝试后,也没有解决我的问题。

3)web.xml

检查WEB-INF - web.xml文件的contextConfigLocation设置,它用于在拦截器中定义配置文件的位置。

  1. 检查param-value指向的Spring配置文件是否正确
  2. 如果没有此配置项,添加一个

如果你不知道应该指向哪个文件,查找你的项目中是否有contextConfig.xml,或内容类似下图中的文件:

经检查,我的配置没有问题。

4)配置Artifacts

如果你使用的IDE是IDEA,按CTRL+ALT+SHIFT+S进入Project Structure设置,选择左侧Artifacts,在右侧选择你Tomcat部署的项目:

Available Elements下方,右键你的项目并选择Put into Output Root

(绝望)还是无法正常启动。

5)Spring版本

由于提示了NoSuchMethodError: clearCache,在经过查阅后得知clearCache()Spring 4.2+版本才有的方法。如果你使用了Maven,可以通过修改pom.xml来修改Spring的版本:

修改(如果不存在则添加)配置:

1<spring.version>4.2.3.RELEASE</spring.version>

重新Build项目。

在修改版本后,我的Spring便换了一个报错:

1Error during artifact deployment. See server log for details.

于是查看日志(IDEA中选择Tomcat Localhost Log选项卡),发现错误原因是:

1java.lang.ClassNotFoundException

很明显,有Jar包并没有被Tomcat所识别,也就是说,Maven在将所有Jar包复制到Tomcat的Lib中时,出现了漏网之鱼

6)Maven:重新导入

既然出现了漏网之鱼,就把Maven中的所有依赖重新导入试试。
在IDEA中,右键pom.xml文件,选择Maven -> Reimport即可。

7)配置Tomcat

由于刚刚我们修改了Artifact,我们就需要将Artiface的项目部署重新绑定到Tomcat中。
在IDEA中,点击右上角的Tomcat项目,选择Edit Configuration

Deployment中,选中第一个窗口中的内容,并点击下方减号,然后再点击加号,重新添加你刚刚修改的Artifact项目部署。

请注意:Application context选项,会在你修改部署文件后自动变更为项目名为目录,我建议将其修改为/,以根目录来访问网站目录。

后语

通过各种尝试,我发现在使用4、6、7三种方法后,我的问题终于得到了解决。在此建议,在备份项目后,尝试每一种方法。祝你修复成功!(我先去自闭了,我相信你会来一起自闭的......)

牢骚:啥也没动就这样了,折腾了一天...... 心累。
把所有的解决方案都尝试复现并记录下来了,希望能帮到现在满头大汉(误)的你。
由于是问题复现,所以记录可能不完整,如有问题可以在评论区交流~

如转载请在文章尾部添加

原作者来自 adlered 个人技术博客:https://www.stackoverflow.wiki/

评论

  1. 😄

取消