tomcat的class加载的优先顺序
来源:https://bbs.csdn.net/topics/80459833
Tomcat的class加载的优先顺序一览
- 最先是$JAVA_HOME/jre/lib/ext/下的jar文件。
- 环境变量CLASSPATH中的jar和class文件。
- \$CATALINA_HOME/common/classes下的class文件。
- \$CATALINA_HOME/commons/endorsed下的jar文件。
- \$CATALINA_HOME/commons/i18n下的jar文件。
- \$CATALINA_HOME/common/lib 下的jar文件。(JDBC驱动之类的jar文件可以放在这里,这样就可以避免在server.xml配置好数据源却出现找不到JDBC Driver的情况。)
- \$CATALINA_HOME/server/classes下的class文件。
- \$CATALINA_HOME/server/lib/下的jar文件。
- \$CATALINA_BASE/shared/classes 下的class文件。
- \$CATALINA_BASE/shared/lib下的jar文件。
- 各自具体的webapp /WEB-INF/classes下的class文件。
- 各自具体的webapp /WEB-INF/lib下的jar文件。
class的搜寻顺序如下:
-------------
Bootstrap classes of your JVM
System class loader classses (described above)
/WEB-INF/classes of your web application
/WEB-INF/lib/*.jar of your web application
(这里可以看出class是先去WEB-INF下面找的)
\${CATALINA_HOME}/common/classes
\${CATALINA_HOME}/common/endorsed/*.jar
\${CATALINA_HOME}/common/i18n/*.jar
\${CATALINA_HOME}/common/lib/*.jar
\${CATALINA_BASE}/shared/classes
\${CATALINA_BASE}/shared/lib/*.jar
--------------
因此放在不同webapp里的class文件,会被classloader加载成不同的实例。
例如假设下面两个不同内容的class。分别放在不同的webapp的class目录下。
package com.lizongbo;
public class TestClass {
private String NAME="lizongbo";
}
package com.lizongbo;
public class TestClass {
private String NAME="li_zongbo";
}
在不同的webapp得到的com.lizongbo.NAME结果是不同的,且互不影响。
但是注意,以下包名开头的class例外:
javax.*
org.xml.sax.*
org.w3c.dom.*
org.apache.xerces.*
org.apache.xalan.*
ps,注意.在各个jar中的\META-INF\MAINFEST.MF文件里Class-Path键值对,也会提供jar的加载优先顺序。
例如某jar的MAINFEST.MF内容如下:
Manifest-Version: 1.0
Created-By: lizongbo
Class-Path: commons-beanutils.jar
Class-Path: commons-collections.jar
Class-Path: commons-dbcp.jar
Class-Path: commons-digester.jar
Class-Path: commons-logging.jar
Class-Path: commons-pool.jar
Class-Path: commons-services.jar
Class-Path: commons-validator.jar
Class-Path: jakarta-oro.jar
Main-Class: com.lizongbo.MyTestClass
那么在加载这个jar的时候,会先在此jar所在目录下依次先加载commons-beanutils.jar,commons-collections.jar......等jar文件。
在不同的地方放置jar和class可能会产生意想不到的后果,尤其是不同版本的jar文件,因此在实际应用部署web应用时候要特别留心.
例如 使用javamail常见的一个出错信息:
javax.mail.NoSuchProviderException: No provider for smtp
其真实原因就很可能如下:
在不同的加载jar的目录下放置了不同版本的mail.jar,比如一个是javamail1.3.1的mail.jar
在D:\jakarta-tomcat-5.5.8\common\lib下,而另外一个是javamail1.3.2的mail.jar在
D:\jakarta-tomcat-5.5.8\webapps\lizongbo\WEB-INF/lib下,
那么lizongbo这个webapp中使用到javamail进行邮件发送的时候,便会出现No provider for smtp的错误。
tomcat的class加载的优先顺序相关推荐
- Tomcat - 模拟Tomcat的webappClassLoader加载自己war包应用内不同版本类实现相互共存与隔离
文章目录 Pre Tomcat要解决什么问题? Tomcat违反了双亲委派机制? 模拟Tomcat的webappClassLoader加载自己war包应用内不同版本类实现相互共存与隔离 Tomcat加 ...
- Tomcat:应用加载原理分析
前情回顾 上一篇文章主要了解了一下Tomcat启动入口,以及初步的分析了Tomcat的启动流程,下面我们将会解密Tomcat应用部署的实际流程. 一.直观对比 虽然前面已经说了那么多关于Tomcat的 ...
- tomcat + spring mvc原理(二):tomcat容器初始化加载和启动
tomcat + spring mvc原理(二):tomcat容器动态加载 容器通用生命周期标准 容器通用生命周期的实现 生命周期状态监听器的管理实现 生命周期方法实现 宏观来看各种容器生命周期的实际 ...
- java中类的加载及执行顺序
为什么80%的码农都做不了架构师?>>> 类的加载顺序 什么时候类加载 第一次需要使用类信息时加载. 类加载的原则:延迟加载,能不加载就不加载. 触发类加载的几种情况: ...
- 今天仔细学习了html加载执行的顺序
页面上通常会有三个标签,html,head,body,这三个之间的关系是,html包含整个页面代码,head主要用于引入一些js,css文件,body用来包含页面代码和js代码 浏览器加载页面的顺序为 ...
- Tomcat 7 自动加载类及检测文件变动原理
在一般的 web 应用开发里通常会使用开发工具(如 Eclipse.IntelJ )集成 tomcat ,这样可以将 web 工程项目直接发布到 tomcat 中,然后一键启动.经常遇到的一种情况是直 ...
- 页面的加载与渲染顺序
页面的加载与渲染顺序: 1.一个页面的加载顺序是从上到下顺序加载的,并且加载与渲染同时进行. 2.引用外部js文件时,当在加载过程中遇到标签时,浏览器会向服务器发送一个reques并等待该reques ...
- 【java】ClassLoader.getResources加载资源的顺序
目录 前言 代码说明 目录结构 FromMultiJar/pom.xml 代码 编译后目录结构 启动命令 ClassLoader.getResources加载资源的顺序 先在本应用(FromMulti ...
- Springboot中属性文件的加载和生效顺序
1.先读取的属性不一定先生效. 2.属性文件的读取顺序:JAVA SE运行时系统属性(启动命令中-D参数指定的属性)>系统环境变量属性>bootstrap属性>application ...
最新文章
- 【Touchinput 】触摸和输入 概述(1)
- Python基础概念_3_操作符与表达式
- .Net Core 环境下构建强大且易用的规则引擎
- 理解ConstraintLayout 对性能的好处
- R语言smoothHR包_SmoothHR產品官方網站 全新體驗、正式上線 !
- pythonstdin和stdout_如何使用os.execv()在python中继承stdin和stdout
- 盘点国内高投资低票房的电影巨制
- 嵌入式linux系统移植的四大步骤_嵌入式 Linux 产品技术评估之系统裁剪与启动速度...
- 涉及第三方支付接口,怎么测?
- 小米手机自带计算机不能用怎么解决,如果小米手机无法进入系统怎么办?
- 兴达易控Profinet转TCP以太网模块
- 路由器、交换机、集线器
- Java之动态代理类实现日志简单实例
- Python爬虫入门教程 41-100 Fiddler+夜神模拟器+雷电模拟器配置手机APP爬虫部分
- texstudio 使用方法_Texstudio使用技巧——基于个人
- Java虚拟机(四)—— Java虚拟机中的对象
- Excel怎么实现分类自动编号
- 超融合一体机如何影响私有云部署
- 十进制数转换成十六进制数~C语言
- Win 10 和 Linux 双系统,从硬盘删除Linux分区,Win 10引导修复