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

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
  • jar包直接拷贝到WEB-INF/lib下和以userLibrary(自己新建的存放jar的文件夹)形式引入的区别?
  • jar包放置在WEB-INF/lib下和通过build path导入的区别是什么?

问题:

1、web架包找不到

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

Build Path 和 WEB-INF/lib 简介

Build Path:可以看成是引用

WEB-INF/lib:可以看成是固定在一个地方

Eclipse编译项目时,是根据Build Path找jar包,如果不用Eclipse来发布项目的话,就会出现找不到jar包,Tomact运行项目,首先是在它自己的公共lib里找jar包,如果找不到就会去项目的WEB-INF/lib目录找,如果找不到就报错。

复制Java项目,报错

因为Eclipse把Build Path的配置写在了项目的.classpath文件中,add Extenrnal jar将jar包引入到工程,.classpath文件的内容就会被更新,所以就会报错。

有时直接把jar包复制到项目的WEB-INF/lib文件夹中没然后刷新项目,Eclipse会自动把jar包在Build Path中引用。如果jar包不是在Build Path里删除引用,而是自己直接把jar包删除或者移到另外一个位置,刷新项目就会出现错误,要去Build Path里吧引用删除。(导入jar包可以从此导入)

纯Java项目:

通俗的讲和classLoder有关,对于纯Java项目来说,它不存在WEB-INF目录,所以在引入jar包的时候一般都是通过Build Path直接引入。纯Java项目使用的是自己本地的JRE,那么classLoder在加载jar和class的时候时分开的们对于我们自己编写的class,会在APP_HOME/bin下。导入的jar包或者user library的配置信息会出现在APP_HOME/.classpath文件中,ClassLoader会很智能去加载这些classes和jar。

Java Web项目:

虽然Eclipse的workspace中存在.calsspath文件,但是即使你导入了自己的user library,它也不会出现在.classpath中,这个就是问题的关键???

对于Java Web项目来说,它最终不是通过本地是JRE去运行的,而是部署到Web服务器上,如Tomact、Weblogic、WebSphere、Jetty等,这些服务器都实现了自身的类加载器

比如Tomact服务器,它有自己的类加载器,根据J2EE的规范去%web-project%/WEB-INF/lib目录下找相应的lib,这就是我们发布的Web应用要符合那个格式。

以Tomact典型结果为例,它的目录结构分别对应4个不同的类加载器,关系如下:

  • common   ------   CommonClassLoder
  • server       ------   CatalinaClassLoader
  • shared      ------    SharedClassLoder
  • webapps   ------    WebappClassLoder

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

Eclipse引用Library是为了编译代码生成WEB-INF/classes里面的class文件使用,使用Eclipse J2EE IDE时,会将WEB-INF/lib中所有的lib自动加入到library中。

Eclipse工程下的library是用来编译src下的java文件,实际发布发到Tomact时,仅仅只复制了WEB-INF/lib里面的jar包,所有出现Eclipse可以正常编辑但Tomact运行时找不到类。

如果你是用的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就可以了,意思是在打包时不把这个架包打进去

问题二:

确定是编译环境报错还是程序报错?

因为程序中只认识WEB-INF/lib中jar包,但是编译环境不是。如果编辑环境在配置中说在某个地方有它要的jar包,那么一旦那个地方没有,就会提示警告信息。

如果要在程序中正常运行,那么不管来自哪里,最后jar包都是放在WEB-INF/lib中的。(建议还是先理解下应用程序中包的组成,如果过于依赖于IDE,很多基本的概念会不理解的。)

问题三:

在Eclipse工程的Java Build Path设置中,可以通过加入第三方的jar包,但是,我发现是有好几种方法来完成这个操作的,有“Add jars”,“Add Externel jars”,“Add library”,“Add Classes Loader”等,这几种方式有什么区别吗?

  • add jar:是表示从你的工程里添加JAR,前提是你把jar已经放到自己的工程目录里。
  • add external jar:表示这个jar的位置需要URI来定位,需要给出全路径。
  • add library: 是一些已经定义好的jar的集合,因为它们经常是一起用,所以简化了些操作,比如你做RCP开发的时候就会有个plugin library包含了运行工程所需要的基本插件。
  • Add classes Loader :这个跟添加jar是一个意思,就是告诉ClassLoader去哪找class

问题四:

当出现java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener类似这种找不到Listener的异常时,要切记spring的jar包一定要放在工程的lib下这样才能避免这个错误的发生?

虽说无论用什么方式导入包在本地运行都是一样的,但实事上我运行时,有的只有Java Build Path才起作用,有的只有导入到lib下才行。用Java Build Path导入包和把包复制到lib下是有区别的,它俩其实不会冲突,也没有什么关系的,Java Build Path是我们编译需要的包,在比如在import *.*.*时如果没用Java Build Path导入包的话类里面就有红叉,说不识别这个类;导入到lib下是程序运行时需要的包,即便用Java Build Path导入过的包,没放到lib下,运行项目时会出现ClassNotFoundException的异常。

普通Java Web项目为什么lib要放在WEB-INF 首先一个项目要编译好之后才能部署到Tomcat中运行。 Tomcat运行时如何找编译好的.class文件呢,其实Tomcat下的web项目有两个预置的classpath(就是能找到.class文件的入口), 这两个预置的classpathWEB-INF/classes与WEF-INF/lib, 其中我们src下的源文件经过了编译之后放在WEB-INF/classes目录下, 而lib在编译前需要放在WEB-INF下编译后才能出现在WEF-INF/lib目录下 所以说lib下如果没有放在WEB-IN 阅读详情

相关推荐

WEB-INFO/lib & build pathjar问题

一、build path&WEB-INFO/lib介绍build path:可以说是引用; WEB-INFO/lib:可以说是固定在一个地方; eclipse编译项目的时候是根据build path的,如果不用eclipse来发布项目的话,就会出现找不到jar,tomcat运行项目首先是在它自己的公共lib里找jar,如果找不到的话就会去项目的WEB-INFO/lib目录找,如果找不到就报错。build path引用的jar可以引用lib下的jar,也可以引用硬盘上任何可以访问位置上的jar,但是,我推荐把

java journey 1万+

idea 如何引入WEB-INFlib中的jar

如图:导入的项目中lib中存在jar 选择Project Structure 选择Modules 并选中Dependencies,点击“+”号 选择JARs 选择jar 添加完成点击Apply 有喜欢的朋友可以关注下头条号《老徐聊技术》 ...

xcc_2269861428的博客 1万+

web项目中将WEB-INF\lib下的Jar添加到项目中

记录bug希望帮助我有一样问题的,哭了改了一上午 1.问题描述 今天上午在写项目时出现一个bug 该有的jar都有但是一直显示 Information:Internal caches are corrupted or have outdated format, forcing project rebuild: java.io.FileNotFoundException: /Users/yuanbao/IdeaProjects/StudentSystem/TrainTicketingSystem02/

joey_ro的博客 5112

Java Web项目的lib为什么要放到WEB-INF目录下?

在Java Web项目中,我们常常会导入项目所需要的 jar ,那为什么 javaweb 项目的 jar 一定要放到 WEB-INF/lib 目录下? 1)src 下的源文件(如:.java)经过了编译之后放在 WEB-INF/classes 目录下 2)lib 在编译前需要放在 WEB-INF 下编译后才能出现在 WEB-INF/lib 目录下,所以除了 tomcat 自带的 jar (JRE)外,项目所需 jar 都应放在 WEB-INFlib 目录下,否则部署的web项目就会缺少lib

devilzcl的博客 4692

webinf下面的lib文件build_转:jar放置WEB-INF/lib通过build path导入区别是什么?...

转自:http://s343174147.iteye.com/blog/1986307jar直接拷贝到WEB-INF/lib以userLibrary形式引入的区别jar放置WEB-INF/lib通过build path导入区别是什么?问题: 1、web找不到 2、maven项目转变web项目通过 Deployment Assembly把架添加到WEB-INF/lib引起的架...

weixin_34112863的博客 313

jar放置WEB-INF/lib通过build path导入区别是什么?

jar直接拷贝到WEB-INF/lib以userLibrary形式引入的区别jar放置WEB-INF/lib通过build path导入区别是什么?问题: 1、web找不到 2、maven项目转变web项目通过 Deployment Assembly把架添加到WEB-INF/lib引起的架冲突 通俗的讲是classLoader有关,对于纯java项目,它不存在W...

s343174147的博客 615

jar直接拷贝到WEB-INF/lib以userLibrary形式引入的区别?/jar放置WEB-INF/lib通过build path导入区别是什么?...

      通俗的讲是classLoader有关,对于纯java项目,它不存在WEB-INF目录,所以在引入jar的时候一般都是通过buildpath直接引入,例如我要引入Spring3X,那么先定义一个user library,然后通过build path引入。   纯 java项目使用的本地自己的JRE,那么classLoader在加载jarclass时候是分开的,对于我们自己编写的c...

weixin_34235105的博客 219

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

问题: 1、web找不到 2、maven项目转变web项目通过 Deployment Assembly把架添加到WEB-INF/lib引起的架冲突   通俗的讲是classLoader有关,对于纯java项目,它不存在WEB-INF目录,所以在引入jar的时候一般都是通过buildpath直接引入,例如我要引入Spring3X,那么先定义一个user library,然后通过bu

平哥的专栏 6344

java web项目下的libbuild pathjar问题解惑

一、build path&WEB-INFO/lib介绍 build path:可以说是引用; WEB-INFO/lib:可以说是固定在一个地方; eclipse编译项目的时候是根据build path的,如果不用eclipse来发布项目的话,就会出现找不到jar,tomcat运行项目首先是在它自己的公共lib里找jar,如果找不到的话就会去项目的WEB-INFO/lib目录找,如果找不...

qq_35129986的博客 1133

eclipse中创建的web项目从/WEB-INF/lib下复制jar与在build path导入jar区别

本文转载自点击打开链接 jar直接拷贝到WEB-INF/lib以userLibrary形式引入的区别jar放置WEB-INF/lib通过build path导入区别是什么? 问题: 1、web找不到 2、maven项目转变web项目通过 Deployment Assembly把架添加到WEB-INF/lib引起的架冲突 通俗的讲是cla

u010921701的博客 8072

MyEclipse中分别通过buildpathlib导入jar区别

第一篇博文 纪念一下 我这个记性实在不好 所以以后会把学习中遇到的问题解决的办法记在这里 聚沙成塔 积水成渊吧 这个问题早就发现了 但今天想搞清楚是为什么 今天写一个小项目 通过buildpath导入MySQL的驱动jar 结果编译没问题 运行出错 (而且在.clas

聚沙成塔 积水成渊 7387

jar放在WEB-INF/libconfig build path区别

jar放在WEB-INF/libconfig build path区别

u012826756的专栏 1353
上一篇: JavaWeb项目 jar包 存放目录的功能与作用
下一篇: JSTL Error ''java.lang.NoClassDefFoundError:javax/servlet/jsp/jstl/core/LoopTag''
IT界幼稚生
博客等级 码龄11年 65粉丝 135原创
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值