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

本贴最后更新于 1898 天前,其中的信息可能已经东海扬尘

前言

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

java.lang.NoSuchMethodError: org.springframework.core.ResolvableType.clearCache()
	at org.springframework.context.support.AbstractApplicationContext.resetCommonCaches(AbstractApplicationContext.java:873)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:559)
	at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403)
	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4853)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5314)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:753)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:729)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
	at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1092)
	at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1834)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
严重: Error configuring application listener of class org.springframework.web.util.Log4jConfigListener
java.lang.ClassNotFoundException: org.springframework.web.util.Log4jConfigListener
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1702)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547)
	at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:532)
	at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:514)
	at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:142)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4854)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5434)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	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

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

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

@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 的版本:

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

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

重新 Build 项目。

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

Error during artifact deployment. See server log for details.

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

java.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 三种方法后,我的问题终于得到了解决。在此建议,在备份项目后,尝试每一种方法。祝你修复成功!(我先去自闭了,我相信你会来一起自闭的......)

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

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    944 引用 • 1459 回帖 • 17 关注
  • debug
    4 引用 • 25 回帖
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...