- 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目录下,这样就能够加载了。