java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener


在使用 Spring 框架構建一個 Web 工程的時候,我們需要在 web.xml 中配置了一個 Spring 的上下文監聽器:

  1 <!-- 服務器啟動時,在Context域中初始化一個applicationContext -->
  2 <listener>
  3      <listener-class>org.springframework.web.context.ContextLoaderListener
  4      </listener-class>
  5 </listener>

隨后在啟動 Tomcat 服務器后,Console 控制台報錯java.lang.ClassNotFoundException:org.springframework.web.context.ContextLoaderListener。

異常描述:

  1 嚴重: Error configuring application listener of class
  2 org.springframework.web.context.ContextLoaderListener
  3    java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
  4    	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass
  5 (WebappClassLoaderBase.java:1858)
  6    	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass
  7 (WebappClassLoaderBase.java:1701)
  8    	at org.apache.catalina.core.DefaultInstanceManager.loadClass
  9 (DefaultInstanceManager.java:504)
 10    	at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged
 11 (DefaultInstanceManager.java:486)
 12    	at org.apache.catalina.core.DefaultInstanceManager.newInstance
 13 (DefaultInstanceManager.java:113)
 14    	at org.apache.catalina.core.StandardContext.listenerStart
 15 (StandardContext.java:4984)
 16    	at org.apache.catalina.core.StandardContext.startInternal
 17 (StandardContext.java:5584)
 18   	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147)
 19   	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:899)
 20   	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:875)
 21   	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
 22   	at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1260)
 23   	at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:2002)
 24   	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
 25   	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
 26   	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
 27   	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
 28   	at java.lang.Thread.run(Thread.java:745)

錯誤分析:

錯誤的意思很明確:找不到“ org.springframework.web.context.ContextLoaderListener”這個類,ContextLoaderListener 這個類是在 spring-web.jar 包下,仔細檢查了項目 jar 環境,發現在 Web 項目下 lib 導入的 spring 的 jar 包中,確實缺少導入一個名為 spring-web-4.3.8.RELEASE.jar 的 jar 包。然后導入,重新啟動 Tomcat 服務器即可順利通過。

 

問題補充:

如果在檢查了項目 jar 環境,發現該 jar 包確實存在,而且也能找到編譯后的 ContextLoaderListener.class 文件。但在啟動 Tomcat 服務器后,Console 控制台依舊報錯 java.lang.ClassNotFoundException:org.springframework.web.context.ContextLoaderListener。

問題的原因可能是你導入的僅僅是 jar 包的引用,例如在 eclipse 的 build path 直接引用的 jar 包(類似快捷方式),沒有把 jar 文件拷貝到 lib 目錄下。即使這種在 Java Application 中沒有問題,但在 web Application 中也可能會出現找不到類的異常。

我們知道JVM虛擬機是根據 Java ClassLoader (類加載器)決定如何加載 Class。  系統默認提供了3個 ClassLoader 。Root ClassLoader、ClassPath Loader 和 Ext ClassLoader  。

而 web Application 使用的是自定義的 ClassLoader,而非JVM中的存在的三種 ClassLoader。所以它無法識別出我們寫在 xml 文件中的第三方類庫的 class 文件,而只有我們寫在 src 目錄下的 java 文件才能使用。

因此,我們必須要把所需的第三方的類庫放入到 WEB-INF/lib 目錄下,web Application 才會識別我們定義在 xml 中的類。然后再重新啟動 Tomcat 服務器便可順利通過。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM