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

2024-05-25 09:32

本文主要是介绍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引起的架包冲突

通俗的讲是和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\**.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就可以了,意思是在打包时不把这个架包打进去。



这篇关于eclipse中创建的web项目从/WEB-INF/lib下复制jar包与在build path中导入jar包的区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1001121

相关文章

go 指针接收者和值接收者的区别小结

《go指针接收者和值接收者的区别小结》在Go语言中,值接收者和指针接收者是方法定义中的两种接收者类型,本文主要介绍了go指针接收者和值接收者的区别小结,文中通过示例代码介绍的非常详细,需要的朋友们下... 目录go 指针接收者和值接收者的区别易错点辨析go 指针接收者和值接收者的区别指针接收者和值接收者的

售价599元起! 华为路由器X1/Pro发布 配置与区别一览

《售价599元起!华为路由器X1/Pro发布配置与区别一览》华为路由器X1/Pro发布,有朋友留言问华为路由X1和X1Pro怎么选择,关于这个问题,本期图文将对这二款路由器做了期参数对比,大家看... 华为路由 X1 系列已经正式发布并开启预售,将在 4 月 25 日 10:08 正式开售,两款产品分别为华

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

springboot项目中常用的工具类和api详解

《springboot项目中常用的工具类和api详解》在SpringBoot项目中,开发者通常会依赖一些工具类和API来简化开发、提高效率,以下是一些常用的工具类及其典型应用场景,涵盖Spring原生... 目录1. Spring Framework 自带工具类(1) StringUtils(2) Coll

Spring Boot项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

CSS Padding 和 Margin 区别全解析

《CSSPadding和Margin区别全解析》CSS中的padding和margin是两个非常基础且重要的属性,它们用于控制元素周围的空白区域,本文将详细介绍padding和... 目录css Padding 和 Margin 全解析1. Padding: 内边距2. Margin: 外边距3. Padd

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法