来源:https://bbs.csdn.net/topics/80459833

Tomcat的class加载的优先顺序一览

  1. 最先是$JAVA_HOME/jre/lib/ext/下的jar文件。
  2. 环境变量CLASSPATH中的jar和class文件。
  3. \$CATALINA_HOME/common/classes下的class文件。
  4. \$CATALINA_HOME/commons/endorsed下的jar文件。
  5. \$CATALINA_HOME/commons/i18n下的jar文件。
  6. \$CATALINA_HOME/common/lib 下的jar文件。(JDBC驱动之类的jar文件可以放在这里,这样就可以避免在server.xml配置好数据源却出现找不到JDBC Driver的情况。)
  7. \$CATALINA_HOME/server/classes下的class文件。
  8. \$CATALINA_HOME/server/lib/下的jar文件。
  9. \$CATALINA_BASE/shared/classes 下的class文件。
  10. \$CATALINA_BASE/shared/lib下的jar文件。
  11. 各自具体的webapp /WEB-INF/classes下的class文件。
  12. 各自具体的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加载的优先顺序相关推荐

  1. Tomcat - 模拟Tomcat的webappClassLoader加载自己war包应用内不同版本类实现相互共存与隔离

    文章目录 Pre Tomcat要解决什么问题? Tomcat违反了双亲委派机制? 模拟Tomcat的webappClassLoader加载自己war包应用内不同版本类实现相互共存与隔离 Tomcat加 ...

  2. Tomcat:应用加载原理分析

    前情回顾 上一篇文章主要了解了一下Tomcat启动入口,以及初步的分析了Tomcat的启动流程,下面我们将会解密Tomcat应用部署的实际流程. 一.直观对比 虽然前面已经说了那么多关于Tomcat的 ...

  3. tomcat + spring mvc原理(二):tomcat容器初始化加载和启动

    tomcat + spring mvc原理(二):tomcat容器动态加载 容器通用生命周期标准 容器通用生命周期的实现 生命周期状态监听器的管理实现 生命周期方法实现 宏观来看各种容器生命周期的实际 ...

  4. java中类的加载及执行顺序

    为什么80%的码农都做不了架构师?>>>    类的加载顺序  什么时候类加载  第一次需要使用类信息时加载.  类加载的原则:延迟加载,能不加载就不加载. 触发类加载的几种情况:  ...

  5. 今天仔细学习了html加载执行的顺序

    页面上通常会有三个标签,html,head,body,这三个之间的关系是,html包含整个页面代码,head主要用于引入一些js,css文件,body用来包含页面代码和js代码 浏览器加载页面的顺序为 ...

  6. Tomcat 7 自动加载类及检测文件变动原理

    在一般的 web 应用开发里通常会使用开发工具(如 Eclipse.IntelJ )集成 tomcat ,这样可以将 web 工程项目直接发布到 tomcat 中,然后一键启动.经常遇到的一种情况是直 ...

  7. 页面的加载与渲染顺序

    页面的加载与渲染顺序: 1.一个页面的加载顺序是从上到下顺序加载的,并且加载与渲染同时进行. 2.引用外部js文件时,当在加载过程中遇到标签时,浏览器会向服务器发送一个reques并等待该reques ...

  8. 【java】ClassLoader.getResources加载资源的顺序

    目录 前言 代码说明 目录结构 FromMultiJar/pom.xml 代码 编译后目录结构 启动命令 ClassLoader.getResources加载资源的顺序 先在本应用(FromMulti ...

  9. Springboot中属性文件的加载和生效顺序

    1.先读取的属性不一定先生效. 2.属性文件的读取顺序:JAVA SE运行时系统属性(启动命令中-D参数指定的属性)>系统环境变量属性>bootstrap属性>application ...

最新文章

  1. 【Touchinput 】触摸和输入 概述(1)
  2. Python基础概念_3_操作符与表达式
  3. .Net Core 环境下构建强大且易用的规则引擎
  4. 理解ConstraintLayout 对性能的好处
  5. R语言smoothHR包_SmoothHR產品官方網站 全新體驗、正式上線 !
  6. pythonstdin和stdout_如何使用os.execv()在python中继承stdin和stdout
  7. 盘点国内高投资低票房的电影巨制
  8. 嵌入式linux系统移植的四大步骤_嵌入式 Linux 产品技术评估之系统裁剪与启动速度...
  9. 涉及第三方支付接口,怎么测?
  10. 小米手机自带计算机不能用怎么解决,如果小米手机无法进入系统怎么办?
  11. 兴达易控Profinet转TCP以太网模块
  12. 路由器、交换机、集线器
  13. Java之动态代理类实现日志简单实例
  14. Python爬虫入门教程 41-100 Fiddler+夜神模拟器+雷电模拟器配置手机APP爬虫部分
  15. texstudio 使用方法_Texstudio使用技巧——基于个人
  16. Java虚拟机(四)—— Java虚拟机中的对象
  17. Excel怎么实现分类自动编号
  18. 超融合一体机如何影响私有云部署
  19. 十进制数转换成十六进制数~C语言
  20. Win 10 和 Linux 双系统,从硬盘删除Linux分区,Win 10引导修复

热门文章

  1. linux tee 重定向_快乐的linux命令行-重定向
  2. Linux下配置OpenLDAP服务记录
  3. Myeclipse 6.5 优化
  4. 指针、引用以及const限定符、constexpr限定符
  5. 【数据结构】线性表大咖
  6. 推荐算法--利用用户行为数据(02)
  7. 哈希表和有序表的简单介绍
  8. 针对C++异常的学习
  9. 数学建模4 论文写作排版和技巧
  10. Android Studio安装问题及填坑