web server apache tomcat11-10-Class Loader

前言

整理这个官方翻译的系列,原因是网上大部分的 tomcat 版本比较旧,此版本为 v11 最新的版本。

开源项目

从零手写实现 tomcat minicat 别称【嗅虎】心有猛虎,轻嗅蔷薇。

系列文章

web server apache tomcat11-01-官方文档入门介绍

web server apache tomcat11-02-setup 启动

web server apache tomcat11-03-deploy 如何部署

web server apache tomcat11-04-manager 如何管理?

web server apache tomcat11-06-Host Manager App -- Text Interface

web server apache tomcat11-07-Realm Configuration

web server apache tomcat11-08-JNDI Resources

web server apache tomcat11-09-JNDI Datasource

web server apache tomcat11-10-Class Loader

...

概述

像许多服务器应用程序一样,Tomcat 安装了各种类加载器(即实现 java.lang.ClassLoader 的类),以允许容器的不同部分以及在容器上运行的 Web 应用程序访问不同的类和资源库。

此机制用于提供 Servlet 规范 2.4 版中定义的功能,特别是第 9.4 节和第 9.6 节。

在 Java 环境中,类加载器被安排成父子树。通常,当类加载器被要求加载特定的类或资源时,它首先将请求委托给父类加载器,然后仅在父类加载器无法找到请求的类或资源时才查看自己的存储库。

请注意,Web 应用程序类加载器的模型与此略有不同,如下所述,但主要原则相同。

当启动 Tomcat 时,它创建了一组类加载器,这些类加载器按以下父子关系组织,其中父类加载器位于子类加载器之上:

      Bootstrap|System|Common/     \Webapp1   Webapp2 ...

每个类加载器的特性,包括它们可见的类和资源的来源,将在以下部分详细讨论。

类加载器定义

如上图所示,Tomcat 在初始化时创建以下类加载器:

  • Bootstrap — 此类加载器包含 Java 虚拟机提供的基本运行时类,以及位于系统扩展目录 ($JAVA_HOME/jre/lib/ext) 中的任何 JAR 文件中的类。注意:一些 JVM 可能将其实现为一个以上的类加载器,或者它可能根本不可见(作为类加载器)。

  • System — 此类加载器通常是从 CLASSPATH 环境变量的内容初始化的。所有这些类对于 Tomcat 内部类和 Web 应用程序都是可见的。但是,标准的 Tomcat 启动脚本 ($CATALINA_HOME/bin/catalina.sh 或 %CATALINA_HOME%\bin\catalina.bat) 完全忽略 CLASSPATH 环境变量本身的内容,并且改为从以下存储库构建 System 类加载器:

    • $CATALINA_HOME/bin/bootstrap.jar — 包含用于初始化 Tomcat 服务器的 main() 方法,以及它依赖的类加载器实现类。
    • $CATALINA_BASE/bin/tomcat-juli.jar 或 $CATALINA_HOME/bin/tomcat-juli.jar — 日志记录实现类。这些包括对 java.util.logging API 的增强类,称为 Tomcat JULI,以及 Tomcat 内部使用的 Apache Commons Logging 库的包重命名副本。有关更多详细信息,请参阅日志记录文档。
    • 如果 $CATALINA_BASE/bin 中存在 tomcat-juli.jar,则会使用它,而不是 $CATALINA_HOME/bin 中的 tomcat-juli.jar。在某些日志记录配置中,这很有用。
    • $CATALINA_HOME/bin/commons-daemon.jar — 来自 Apache Commons Daemon 项目的类。此 JAR 文件不包含在 catalina.bat|.sh 脚本构建的 CLASSPATH 中,但是在 bootstrap.jar 的清单文件中引用了它。
  • Common — 此类加载器包含了对 Tomcat 内部类和所有 Web 应用程序都可见的其他类。

    通常情况下,应用程序类不应放在此处。此类加载器搜索的位置由 $CATALINA_BASE/conf/catalina.properties 中的 common.loader 属性定义。默认设置将按照它们列出的顺序搜索以下位置:

    • $CATALINA_BASE/lib 中未打包的类和资源
    • $CATALINA_BASE/lib 中的 JAR 文件
    • $CATALINA_HOME/lib 中未打包的类和资源
    • $CATALINA_HOME/lib 中的 JAR 文件

默认情况下,这包括以下内容:

  • annotations-api.jar — Jakarta Annotations 2.1.1 类。
  • catalina.jar — Tomcat 的 Catalina servlet 容器部分的实现。
  • catalina-ant.jar — 可选。用于与 Manager web 应用程序一起使用的 Tomcat Catalina Ant 任务。
  • catalina-ha.jar — 可

选。基于 Tribes 构建的提供会话集群功能的高可用性包。

  • catalina-ssi.jar — 可选。服务器端包含模块。

  • catalina-storeconfig.jar — 可选。从当前状态生成 XML 配置文件。

  • catalina-tribes.jar — 可选。高可用性包使用的组通信包。

  • ecj-*.jar — 可选。用于将 JSP 编译为 Servlet 的 Eclipse JDT Java 编译器。

  • el-api.jar — 可选。EL 6.0 API。

  • jakartaee-migration-*-shaded.jar — 可选。提供将 Web 应用程序从 Java EE 8 转换为 Jakarta EE 9 的功能。

  • jasper.jar — 可选。Tomcat Jasper JSP 编译器和运行时。

  • jasper-el.jar — 可选。Tomcat EL 实现。

  • jaspic-api.jar — Jakarta Authentication 3.0 API。

  • jsp-api.jar — 可选。Jakarta Pages 4.0 API。

  • servlet-api.jar — Jakarta Servlet 6.1 API。

  • tomcat-api.jar — Tomcat 定义的几个接口。

  • tomcat-coyote.jar — Tomcat 连接器和实用程序类。

  • tomcat-dbcp.jar — 可选。基于 Apache Commons Pool 2 和 Apache Commons DBCP 2 的包重命名副本的数据库连接池实现。

  • tomcat-i18n-**.jar — 可选的 JAR,包含其他语言的资源包。由于默认包含了每个单独 JAR 中的默认包,因此如果不需要对消息进行国际化,则可以安全地删除它们。

  • tomcat-jdbc.jar — 可选。另一种数据库连接池实现,称为 Tomcat JDBC 池。有关更多详细信息,请参阅文档。

  • tomcat-jni.jar — 提供与 Tomcat Native 库的集成。

  • tomcat-util.jar — Apache Tomcat 各个组件使用的公共类。

  • tomcat-util-scan.jar — 提供 Tomcat 使用的类扫描功能。

  • tomcat-websocket.jar — 可选。Jakarta WebSocket 2.1 实现。

  • websocket-api.jar — 可选。Jakarta WebSocket 2.1 API。

  • websocket-client-api.jar — 可选。Jakarta WebSocket 2.1 客户端 API。

  • WebappX — 为部署在单个 Tomcat 实例中的每个 Web 应用程序创建一个类加载器。您的 Web 应用程序的 /WEB-INF/classes 目录中的所有未打包的类和资源,以及您的 Web 应用程序的 /WEB-INF/lib 目录下的 JAR 文件中的类和资源,都会对该 Web 应用程序可见,但对其他 Web 应用程序不可见。

如上所述,Web 应用程序类加载器与默认的 Java 委托模型有所不同(根据 Servlet 规范 2.4 第 9.7.2 节 Web 应用程序类加载器的建议)。当处理对 Web 应用程序的 WebappX 类加载器的加载类的请求时,此类加载器首先会查找本地存储库,而不是委托给父级再查找。但也有一些例外。JRE 基本类的一部分无法被覆盖。有一些例外,比如可以使用可升级模块功能覆盖的 XML 解析器组件。最后,对于由 Tomcat 实现的规范(Servlet、JSP、EL、WebSocket),Web 应用程序类加载器始终首先委托。Tomcat 中的所有其他类加载器都遵循通常的委派模式。

因此,从 Web 应用程序的角度来看,类或资源加载按以下顺序查找存储库:

  1. JVM 的 Bootstrap 类
  2. 您的 Web 应用程序的 /WEB-INF/classes
  3. 您的 Web 应用程序的 /WEB-INF/lib/*.jar
  4. System 类加载器类(上文描述)
  5. Common 类加载器类(上文描述)

如果 Web 应用程序类加载器配置为 <Loader delegate="true"/>,则顺序变为:

  1. JVM 的 Bootstrap 类
  2. System 类加载器类(上文描述)
  3. Common 类加载器类(上文描述)
  4. 您的 Web 应用程序的 /WEB-INF/classes
  5. 您的 Web 应用程序的 /WEB-INF/lib/*.jar

XML解析器和Java

在旧版本的Tomcat中,您可以简单地替换Tomcat库目录中的XML解析器,以更改所有Web应用程序使用的解析器。然而,在运行现代版本的Java时,这种技术将不会有效,因为通常的类加载器委托过程总是会优先选择JDK内部的实现,而不是这个解析器。

Java支持一种称为可升级模块的机制,允许替换在JCP之外创建的API(即W3C的DOM和SAX)。它还可以用于更新XML解析器的实现。

请注意,覆盖任何JRE组件都存在风险。如果覆盖组件不提供100%兼容的API(例如,Xerces提供的API与JRE提供的XML API不完全兼容),那么Tomcat和/或部署的应用程序可能会遇到错误。

高级配置

还可以配置更复杂的类加载器层次结构。请参见下面的图表。默认情况下,服务器和共享类加载器未定义,并且使用上面显示的简化层次结构。可以通过在 conf/catalina.properties 中定义 server.loader 和/或 shared.loader 属性的值来使用此更复杂的层次结构。

  Bootstrap|System|Common/  \
Server  Shared/  \Webapp1  Webapp2 ...

服务器类加载器仅对Tomcat内部可见,对Web应用程序完全不可见。

共享类加载器对所有Web应用程序可见,可用于在所有Web应用程序之间共享代码。但是,对此共享代码的任何更新都将需要重新启动Tomcat。

参考资料

https://tomcat.apache.org/tomcat-11.0-doc/class-loader-howto.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/901.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI推介-多模态视觉语言模型VLMs论文速览(arXiv方向):2024.04.10-2024.04.15

文章目录~ 1.Photo-Realistic Image Restoration in the Wild with Controlled Vision-Language Models2.Do LLMs Understand Visual Anomalies? Uncovering LLM Capabilities in Zero-shot Anomaly Detection3.UNIAA: A Unified Multi-modal Image Aesthetic Assessment Base…

大华相机C#学习之Enumerator类

构造函数 Enumerator() 创建一个Enumerator实例。 常用方法 EnumerateDevices() 枚举所有发现设备,返回List<IDeviceInfo>对象。 List<IDeviceInfo> devices new List<IDeviceInfo>();private void test_Click(object sender, EventArgs e) {devicesEnum…

【Spring进阶】基于注解的面向切面编程(AOP)详解

hi&#xff0c;我是程序员王也&#xff0c;一个资深Java开发工程师&#xff0c;平时十分热衷于技术副业变现和各种搞钱项目的程序员~&#xff0c;如果你也是&#xff0c;可以一起交流交流。 今天我们聊一聊Spring中的AOP~ AOP的核心概念 面向切面编程&#xff08;AOP&#xff…

如何实现redis的高可用?

1.主从模式&#xff1a;就是一个住节点&#xff0c;多个从节点&#xff0c;但是弊端是一个主节点崩了&#xff0c;需要手动的切换从节点&#xff0c;这个挺麻烦的 2.哨兵模式&#xff1a;就是为了解决主从模式的弊端从而在主从模式的基础上加了哨兵&#xff0c;从而可以实现自动…

【一】ECharts----【基本概念、基本实例】

目录 零.前言 一.ECharts的安装 1.1独立版本的安装 1.2CDN的安装 1.3NPM的安装 二.ECharts实例 三.系列(series) 四.创建一个ECharts图表的基本步骤 4.1创建一个DOM容器 4.2使用DOM节点初始化ECharts对象 4.3设置配置信息 4.3.1图表标题 4.3.2提示信息 4.3.3图例组…

90天玩转Python—18—Python面向对象编程:核心概念详解

90天玩转Python系列文章目录 90天玩转Python—01—基础知识篇:C站最全Python标准库总结 90天玩转Python--02--基础知识篇:初识Python与PyCharm 90天玩转Python—03—基础知识篇:Python和PyCharm(语言特点、学习方法、工具安装) 90天玩转Python—04—基础知识篇:Pytho…

提取点云-------PCL

提取点云 /// <summary> /// VoxelGrid滤波下采样 /// </summary> /// <param name"cloud">需要滤波的点云</param> /// <param name"lx">三维体素栅格的x</param> /// <param name"ly">三维体素栅格…

全新Linux教程-驱动大全-PCI和PCIe子系统-P2-PCI设备的访问方法-非桥设备

主要讲PCI设备的硬件访问方法。 1、PCI的硬件结构 CPU发出的地址是CPU地址&#xff0c;可能是访问底下任何一个设备。地址范围不一样&#xff0c;访问到的外设就不一样。在嵌入式中&#xff0c;通常将4G内存地址空间分成好几个区域&#xff0c;不同的访问分给不同的地址。桥内…

Github首页美化(updating)

Github首页美化 一、新建仓库二、美化Github首页主页访问量统计仓库状态统计常用语言占比统计社交链接 界面展示 一、新建仓库 对Github首页进行美化&#xff0c;需要新建一个仓库名和自己 Github 用户名相同的仓库&#xff1b;并且需要添加一个 README.md自述文件即可。 如果…

nVisual在线网络规划设计软件

●01● nVisual在线网络规划设计软件 在信息化快速发展的今天&#xff0c;网络基础设施的建设与优化变得尤为关键。为了满足现代通信行业对高效、精准的网络规划需求&#xff0c;nVisual在线网络规划设计软件应运而生&#xff0c;它通过集成先进的GIS技术和网络规划工具&#…

Ansible相关

Ansible 环境准备 主机名ip分组crontol192.168.88.1node1192.168.88.11testnode2192.168.88.12proxynode3192.168.88.13webserversnode4192.168.88.14webserversnode5192.168.88.15database 所有操作只需在crontol上操作即可 安装ansible # 依赖一般也会跟着一起装好 yum …

sprinboot+vue集成neo4j图数据库

一 、java后台 1.1 package com.admin.domain;/*** 功能描述&#xff1a;** author wangwei* date 2024-01-15 22:13*/ public class ConnectWeb {private String connectWebId;private String connectWebName;private String connectWebInfo;private String personWebIdAlph…

Vue.js------Vue组件基础

能够理解Vue组件概念和作用能够掌握封装创建组件能力能够使用组件之间通信能够完成todo案例 一.Vue组件创建和使用 1.折叠面板-实现多个 创建一个文件夹demo 具体步骤请参考vue.js---vue基础 ⚫ 解决方案: 采用vue提供的单.vue文件-组件方式来封装一套然后复用 在component…

华为校招机试 - 会议通知转发总人数(20240410)

题目描述 在一个办公区内,有一些正在办公的员工,当员工 A 收到会议通知: 他会将这个会议通知转发给周围四邻(上下左右工位的同事)团队内的同事,周围收到该邮件的同事会继续转发给周围四邻(上下左右工位的同事)团队内的同事,直到周围没有再需要往下传播的同事则会停止…

构建Python中的分布式日志系统:ELK与Fluentd的结合

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在现代软件开发中&#xff0c;日志系统是至关重要的组成部分。它们不仅用于故障排查和性能监…

利用Python进行大规模数据处理

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 利用Python进行大规模数据处理&#xff1a;Hadoop与Spark的对比 随着数据量的不断增长&…

ZJGSU 1850 不同出栈情况

描述 假设有n个元素依次进栈&#xff0c;给出他们可能的不同的出栈情况。 输入 3 1 2 3 输出 1 2 3 1 3 2 2 1 3 2 3 1 3 2 1 输入样例 1 3 1 2 3 输出样例 1 1 2 3 1 3 2 2 1 3 2 3 1 3 2 1 #include <stdio.h>int tot, res, sta, n; int r[2005], s[2005…

centos linux 7.9安装php8.2.18不支持mysqli模块,如何解决?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

蓝桥杯竞赛类型:Web应用开发 全程详解

既然大家准备报名蓝桥杯&#xff0c;那么对蓝桥杯就应该有一定的了解了。没有了解也没关系&#xff0c;简单来说&#xff0c;蓝桥杯就是一个计算机竞赛&#xff0c;竞赛类型大多是使用各种语言写算法&#xff0c;当然还有本文的主体——Web应用开发。对蓝桥杯有了基本了解之后&…

Https协议如何保证安全性?

Https和Http的关系 Https是Http里的一层加密层&#xff0c;如果协议走了这一层加密层&#xff0c;那么就是https。如果没有&#xff0c;则是单纯的http。 因为没有走ssl/tls这层加密层&#xff0c;所以这是单纯的http协议&#xff0c;数据在网络中传输是明文的&#xff0c;也…