文档章节

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

GusFring
 GusFring
发布于 2017/07/31 23:02
字数 821
阅读 22
收藏 1

问题: 1、web架包找不到 2、maven项目转变web项目通过 Deployment Assembly把架包添加到WEB-INF/lib引起的架包冲突

  通俗的讲是和classLoader有关,对于纯Java项目,它不存在WEB-INF目录,所以在引入jar包的时候一般都是通过buildpath直接引入,例如我要引入Spring3X,那么先定义一个user library,然后通过build path引入。

  纯java项目使用的本地自己的JRE,那么classLoader在加载jar和class时候是分开的,对于我们自己编写的class,会在APP_HOME/bin下。导入的jar包或者user library的配置信息会出现在APP_HOME/.classpath文件中,ClassLoader会很智能去加载这些classes和jar。.classpath文件内容如下:

  < xml version="1.0" encoding="UTF-8" >
<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\*re\wtpwebapps找到运行时发布的工程就可以明白了 
说白了就是用eclipse j2ee IDE开发web的时候,如果是编译java代码用到的jar可以作为library引用,如果是框架非java代码部分用到的jar就必须放在lib下面。

本文转载自:

GusFring
粉丝 10
博文 33
码字总数 14720
作品 0
南京
程序员
私信 提问
在myeclipse6.5中导入项目后需要再次导入jar包的问题

我有一个java web项目需要导入到myeclise6.5中。我在myeclipse6.5下新建了一个java web项目,然后将需要导入的src 和webroot中的内容分别导入到新项目中对应的文件夹下,编译总是报错。必须要...

liu奇峰
2012/07/28
3.5K
2
java.lang.NoClassDefFoundError:TagSupport

这个错误应该就是没有成功加载tomcat自带的jar包jsp-api.jar。 在网上看到很多网友说要把tomcat/lib下的jsp-api.jar拷贝到项目/WEB_INF/lib下并导入,本人试了一下这是有问题的,这样虽然在启...

街头浪子
2015/12/25
54
0
Eclipse和MyEclipse中简化外部jar包引入的操作

在s2sh中,由于要导入的包比较多,为避免每次都在webRoot/WEB-INF/lib下粘贴包进来,然后build path,比较麻烦,而且容易出现少包丢包或者漏包的错误,因此,采用下述方法以方便操作,减少谬误: 1、...

ty_young
2016/09/12
0
0
eclipse导入第三方jar包进入web项目的方法

此方式是没有用maven进行构建的项目,纯动态项目。 具体方法: 1、通过Java Build Path导入。 比如我项目上要用servlet-api.jar这个包,我所用的web容器是tomcat,那么如下操作: 项目->右键...

easonjim
2016/12/24
0
0
javaEE启动tomcate报错

严重: One or more listeners failed to start. Full details will be found in the appropriate container log file 严重: Skipped installing application listeners due to previous erro......

pxypxy
2016/11/17
18
0

没有更多内容

加载失败,请刷新页面

加载更多

ERC-777以太坊新代币标准解读

ERC777是一个新的高级代币标准,可以视为ERC20的升级版本,因此它解决了ERC20以及ERC223存在的一些问题,开发者可以根据自己的具体需求进行选型。 1、使用ERC820进行合约注册 有别于ERC20的自...

汇智网教程
54分钟前
4
0
代理模式之JDK动态代理 — “JDK Dynamic Proxy“

动态代理的原理是什么? 所谓的动态代理,他是一个代理机制,代理机制可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成,通过代理可以有效的让调...

code-ortaerc
今天
5
0
学习记录(day05-标签操作、属性绑定、语句控制、数据绑定、事件绑定、案例用户登录)

[TOC] 1.1.1标签操作v-text&v-html v-text:会把data中绑定的数据值原样输出。 v-html:会把data中值输出,且会自动解析html代码 <!--可以将指定的内容显示到标签体中--><标签 v-text=""></......

庭前云落
今天
8
0
VMware vSphere的两种RDM磁盘

在VMware vSphere vCenter中创建虚拟机时,可以添加一种叫RDM的磁盘。 RDM - Raw Device Mapping,原始设备映射,那么,RDM磁盘是不是就可以称作为“原始设备映射磁盘”呢?这也是一种可以热...

大别阿郎
今天
14
0
【AngularJS学习笔记】02 小杂烩及学习总结

本文转载于:专业的前端网站☞【AngularJS学习笔记】02 小杂烩及学习总结 表格示例 <div ng-app="myApp" ng-controller="customersCtrl"> <table> <tr ng-repeat="x in names | orderBy ......

前端老手
昨天
16
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部