前言
一如既往的今天,打算打开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查看错误日志:
在各种翻找和思考后,我尝试了以下几种办法:
下方都有可能是导致出现该问题的解决方案,每个解决方案不能保证解决问题,但我建议在备份后多做尝试。
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
设置,它用于在拦截器中定义配置文件的位置。
- 检查
param-value
指向的Spring配置文件是否正确
- 如果没有此配置项,添加一个
如果你不知道应该指向哪个文件,查找你的项目中是否有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三种方法后,我的问题终于得到了解决。在此建议,在备份项目后,尝试每一种方法。祝你修复成功!(我先去自闭了,我相信你会来一起自闭的......)
牢骚:啥也没动就这样了,折腾了一天...... 心累。
把所有的解决方案都尝试复现并记录下来了,希望能帮到现在满头大汉(误)的你。
由于是问题复现,所以记录可能不完整,如有问题可以在评论区交流~