首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

jar包置放在WEB-INF/lib下和通过build path导入的区别是什么

2013-12-10 
jar包放置在WEB-INF/lib下和通过build path导入的区别是什么?classpath??? classpathentry kindsrc

jar包放置在WEB-INF/lib下和通过build path导入的区别是什么?
<classpath>
??? <classpathentry kind="src" path="src"/>
??? <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jre6"/>
??? <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Spring3.1.0"/>
??? <classpathentry kind="lib" path="E:/Jar_Framework/cglib/cglib-2.2.2.jar" sourcepath="E:/Jar_Framework/cglib/cglib-src-2.2.2.jar"/>
??? <classpathentry kind="lib" path="E:/Jar_Framework/commons-logging-1.1.1-bin/commons-logging-1.1.1/commons-logging-1.1.1.jar"/>
??? <classpathentry kind="lib" path="E:/Jar_Framework/aopalliance-1.0/aopalliance-1.0.jar"/>
??? <classpathentry kind="lib" path="E:/Jar_Framework/cglib/cglib-nodep-2.2.2.jar"/>
??? <classpathentry kind="lib" path="E:/Jar_Framework/spring revelant/aspectj-1.6.12.jar"/>
??? <classpathentry kind="lib" path="E:/Jar_Framework/spring revelant/aspectjweaver-1.6.8.jar"/>
??? <classpathentry kind="lib" path="E:/Jar_Framework/spring revelant/asm-3.2.jar"/>
??? <classpathentry kind="output" path="bin"/>
</classpath>

这样ClassLoader就会正确的找到所有需要的类。

而对于java web项目,就不一样了,虽然eclipse的workspace中仍然有.classpath文件,但即使你导入的了自己定义的user library,它也不会出现在.classpath中,这就是问题的关键。这到底是为什么呢???

对于java web项目,它最终不是通过本地的JRE去运行,而是部署到web 服务器,如Tomcat、Weblogic、WebSphere等,这些服务器都实现了自身的类加载器。
比如tomcat应用服务器,它有其自己的类加载器,根据J2EE的规范去%web-project%/WEB-INF/lib的规范去找相应的lib,这就是为什么我们发布的WEB应用要符合那个格式
以Tomcat典型结果为例,它的目录结构分别对应四个不同的类加载器,关系如下:

common????? ---?? CommonClassLoader

server????????? ---??? CatalinaClassLoader

shared???????? ---??? SharedClassLoader

webapps???? ---??? WebappClassLoader

我们的 web 应用都是部署到 webapps 目录下,而WebappClassLoader加载器专门负责加载 webapps 下所有web项目的 WEB-INF 下的类库和类文件。而我们通过 build path 引入的 jar 包自然不会被 WebappClassLoader 加载器加载,所以才会出现 ClassNotFoundException 。

eclipse引用library 是为了编译代码生成WEB-INF/classes里面的class文件使用,使用eclipse j2ee IDE时,会将WEB-INF/lib中所有的lib自动加入到library中
eclipse工程下的library是用来编译里面的src中java文件的
实际发布到tomcat时,仅仅只复制了WEB-INF/lib里面的jar包,所以出现eclipse可以正常编译但tomcat运行是找不到类,
如果你是用的eclipse j2ee IDE,你去WorkSpace\.metadata\.plugins\**.server.core\wtpwebapps找到运行时发布的工程就可以明白了
说白了就是用eclipse j2ee IDE开发web的时候,如果是编译java代码用到的jar可以作为library引用,如果是框架非java代码部分用到的jar就必须放在lib下面。

maven 转变成web项目时经常会出现架包冲突(servlet -api.jar这个架包会和Tomcat中的冲突)但是把项目打成架包就会不由冲突这是怎么解决的呢:

解决的方法是:<dependency>
?? <groupId>javax.servlet</groupId>
?? <artifactId>servlet-api</artifactId>
?? <version>2.4</version>
?? <scope>provided</scope>
?</dependency>
?把scope的值填成provided就可以了,意思是在打包时不把这个架包打进去

热点排行