今天學習spring項目的時候出現了下面的錯誤信息:
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
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$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
雖然問題一眼就知道是這句話:java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
但是還是有點迷糊,因為以前練習spring的時候,是把jar包都復制到WEB-INF/Lib目錄下的,但是最近練習項目的時候都是自己建立自己不同的User libaraies,很明顯我已經導入了這些jar包,但是卻提示這樣的信息..............
看來自己對於JVM是如何引入我們所需要的第三方jar包的機制,后來去網上仔細搜了以下,才明白其原理,下面不廢話,直接重點:
|
原來是我們自使用類似於Ant來獲取類的時候是不能象UserLibaray來使用的,因為我們建立的是一個web app,而web app使用的是自定義的ClassLoader,而非JVM中的存在的三種ClassLoader(如上面所說),因此它無法識別出我們寫在xml文件中的第三方類庫的class文件,而只有我們寫在src目錄下的java文件才能使用,因此,我們必須要把第三方的類庫放入到lib目錄下,web app 才會識別我們定義在xml中的類了 .
通這個錯誤,也讓我對classloader的認識也進了一步.雖然以前看過周志明的深入JVM一書中關於類加載器分派體系的介紹,但是不太理解,這樣一來,自己也多了一些體會.
javalangClassNotFoundException: orgspringframeworkwebcontextContextLoa
spring-web 的jar包沒導進去
jar包郵沖突,把重復的jar包刪除
在web.xml加上<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext-*.xml</param-value> </context-param>
因為默認的讀取的是/WEB-INF下的配置文件,如果配置文件在src中要把路徑改為類路徑底下
4.把工程刷新一下,因為工程是部署在服務器底下的,要把加入的jar包部署到工程里。
啟動報錯:javalangClassNotFoundException: orgspringframeworkwebcontextContextLoaderListener
jar包不是導入進去就完了,還要buildpath,也就是創建路徑。在Myeclipse里面,右鍵單擊你的jar包,點擊build path--》add build path。完成創建路徑。另外spring的jar包並非只有一個,最基本的有3個。