eclipse web项目 user library不能自动copy到项目lib目录

在使用eclipse作web项目时,为了方便管理jar包,自建了各类 User Library做为第三方的库引入项目,在eclipse中不报任何错误,可是当Web项目发布到tomcat的时候,出现错误:

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



相关文章
相关标签/搜索