- java.lang.ClassNotFoundException
各類的ClassNotFoundException,很納悶,明明引入了全部的jar包,爲什麼會報ClassNotFoundException?
上網查找一下,明白了:
classLoader有關,對於純java項目,它不存在WEB-INF目錄,因此在引入jar包的時候通常都是經過buildpath直接引入,例如我要引入Hibernate,那麼先定義一個user library,而後經過build path引入便可。
純java項目使用的本地本身的JRE,那麼classLoader在加載jar和class時候是分開的,對於咱們本身編寫的class,會在APP_HOME/bin下。導入的jar包或者user library的配置信息會出如今APP_HOME/.classpath文件中,ClassLoader會很智能去加載這些classes和jar。
而對於web項目,
雖然eclipse的workspace中仍然有.classpath文件,但即便你導入的了本身定義的user library,它也不會出如今.classpath中,這就是問題的關鍵。
對於java web項目,它最終不是經過本地的JRE去運行,而是部署到web 服務器,如Tomcat、Weblogic、WebSphere等,這些服務器都實現了自身的類加載器。java
以Tomcat典型結果爲例,它的目錄結構分別對應四個不一樣的類加載器,關係以下:web
common --- CommonClassLoadertomcat
server --- CatalinaClassLoader服務器
shared --- SharedClassLoaderapp
webapps --- WebappClassLoadereclipse
咱們的 web 應用都是部署到 webapps 目錄下,而
WebappClassLoader加載器專門負責加載 webapps 下全部web項目的 WEB-INF 下的類庫和類文件。
而咱們經過 user library 引入的 jar 包天然不會被 WebappClassLoader 加載器加載,因此纔會出現 ClassNotFoundException 。
解決方法:
右鍵項目,選擇properties,而後選擇deployment assembly,在這裏,將本身用的到UserLibrary添加進來就OK了,在部署項目的時候,eclipse會將UserLibrary的全部jar包copy到tomcat的項目的lib目錄下,這樣就能夠加載了。