ToB企服应用市场:ToB评测及商务社交产业平台

标题: web server apache tomcat11-10-Class Loader [打印本页]

作者: 立聪堂德州十三局店    时间: 2024-5-17 21:26
标题: 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 时,它创建了一组类加载器,这些类加载器按以下父子关系组织,其中父类加载器位于子类加载器之上:
  1.       Bootstrap
  2.           |
  3.        System
  4.           |
  5.        Common
  6.        /     \
  7.   Webapp1   Webapp2 ...
复制代码
每个类加载器的特性,包罗它们可见的类和资源的来源,将在以下部分详细讨论。
类加载器定义

如上图所示,Tomcat 在初始化时创建以下类加载器:
默认环境下,这包罗以下内容:
选。基于 Tribes 构建的提供会话集群功能的高可用性包。
如上所述,Web 应用程序类加载器与默认的 Java 委托模子有所不同(根据 Servlet 规范 2.4 第 9.7.2 节 Web 应用程序类加载器的建议)。当处理对 Web 应用程序的 WebappX 类加载器的加载类的请求时,此类加载器首先会查找当地存储库,而不是委托给父级再查找。但也有一些例外。JRE 根本类的一部分无法被覆盖。有一些例外,比如可以利用可升级模块功能覆盖的 XML 解析器组件。最后,对于由 Tomcat 实现的规范(Servlet、JSP、EL、WebSocket),Web 应用程序类加载器始终首先委托。Tomcat 中的所有其他类加载器都遵循通常的委派模式。
因此,从 Web 应用程序的角度来看,类或资源加载按以下顺序查找存储库:
如果 Web 应用程序类加载器配置为 ,则顺序变为:
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 属性的值来利用此更复杂的层次结构。
  1.   Bootstrap
  2.       |
  3.     System
  4.       |
  5.     Common
  6.      /  \
  7. Server  Shared
  8.          /  \
  9.    Webapp1  Webapp2 ...
复制代码
服务器类加载器仅对Tomcat内部可见,对Web应用程序完全不可见。
共享类加载器对所有Web应用程序可见,可用于在所有Web应用程序之间共享代码。但是,对此共享代码的任何更新都将需要重新启动Tomcat。
参考资料

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4