java的classload机制--Tomcat 5

tomcat安全加载CLASS分析 前言在《通过tomcat源码查看其如何实现应用相互隔离》中,我介绍了在Bootstrap的init方法中,其中有关类加载器的执行有3步: 初始化commonLoader、catalinaLoader和sharedLoader; 将catalinaLoader设置为Tomcat主线程的线程上下文类加载器; 线程安全的加载class。 这篇博客就是介绍如何tomcat线程安全的加载class。安全加载C 阅读详情
Tomcat是接触最久的应用服务器,同时也被它的classloading愚弄过好多次。印象中比较深的一次是建立了一个web应用,使用oracle数据库,我把oracle的jdbc driver放到了WEB-INF/lib目录下面,然后给Tomcat配置了数据源,在这个应用里面连接这个数据源,来访问数据库。看起来一切正常,可是一启动Tomcat,就报出一个错误,说是找不到driver类。后来知道这是由于Tomcat的classloading机制造成的。总的来说,Tomcat开源、简单,文档清楚,又学习过一阵它的源码,是我了解最多的应用服务器了,所以就从它开始。
 
      运行Tomcat就是运行org.apache.catalina.startup.Bootstrap类的main方法,和运行普通的应用程序并无二致,所以Java 2的classloading机制适用于这个过程。但是Bootstrap运行起来以后,会加载common、server下面的类,加载webapps下面的web应用。这些类的加载是由不同的classloader来完成的。Tomcat的classloader结构如下:

BootStrap classloader(加载JRE/lib下的rt.jar和其他重要jar文件)


                                                     é

ExtClassLoader (加载JRE/lib/ext下的jar文件,Java扩展框架使用)

                                                     é

AppClassLoader ($CATALINA_HOME/bin/下bootstrap.jar, commons-logging -api.jar,commons-daemon.jar,$JAVA_HOME/lib/tools.jar,jmx.jar)

                                   é

common (加载$CATALINA_HOME/common/,Tomcat本身和Web App共享类)

                  é                                                                        é

Catalina (加载$CATALINA_HOME /server/,Tomcat本身使用的类)

Shared (加载$CATALINA_BASE /shared/,所有Web App共享类)

                                                        é

WebappClassLoader (加载各个Web App的class,不同的Web App被隔离开)

Tomcat在启动的时候,完全忽略了class path的设置,而重新设置了class path,所以AppClassLoader 载入的类将不是class path设置的类。
 
Tomcat没有完全使用Java 2的parent delegation模型。这一点体现在WebappClassLoader上。在一个web app中,载入类的过程是这样的:
 
首先检查本地的WebappClassLoader,如果没有,
则请求它的父ClassLoader,即shared。
从shared开始,采用parent delegation,即shared请求它的父classloader common来载入类,这个过程一直延续到BootStrap classloader。
 

正是因为这种机制,使我们在两个Web app中有相同的class的时候,不会相互干扰。比如说,两个app中都使用了log4j,在WEB-INF/lib下面分别有一份log4j.jar,配置输出到不同的文件。因为WebappClassLoader仅对本app可见,所以log4j可以独立工作,而不相互影响。但是,如果我们把这两个app下面的log4j.jar移动到shared目录或者common目录,那他们就会把日志输出到同样的文件了,因为这时候是共享的。
 
记得当时看到WebappClassLoader的这个特性,心下暗喜,盘算着自己能不能写一个java.lang.String类,放到WEB-INF/lib下面,而得到优先加载的机会呢?马上兴冲冲地进行试验,但是结果让我失望,翻出tomcat的源码一看,发现以java.,javax.,sun.,开头的class,WebappClassLoader一概不予理会,直接把烫山芋扔给它的父loader了。另外,Tomcat文档交待,遇到加载org.xml.sax.* ,org.w3c.dom.* ,org.apache.xerces.* ,org.apache.xalan.* 这些包的class的请求,WebappClassLoader也不会受理。

引用地址:
博科的SAN交换机基本操作 2、添加用户testuser赋予user权限可以访问1-128VF默认VF为128账号描述"Test user"密码为password123。1、创建zone别名(100是指当前设备Domain ID,1和2是指对应的index号)2,删除新接入设备的ZONE或保持ZONE配置一致。3、将zone添加到当前生效的CFG中。2、将zone添加到当前生效的CFG中。3、将zone添加到当前生效的CFG中。3,将添加的级联端口持续关闭。4、将当前zone生效。4、将当前zone生效。1、查看当前所有用户。 阅读详情

相关推荐

Qwen3.5在昇腾NPU上部署:vLLM-Ascend全链路实战

大语言模型推理框架(如vLLM)通过PagedAttention等内存调度机制,显著提升显存利用率与吞吐性能;国产AI芯片(如昇腾NPU)需配套专用算子优化与硬件感知调度才能释放真实算力。本文聚焦Qwen3.5大语言模型在昇腾平台的端到端部署,深入解析vLLM-Ascend如何协同CANN工具链、适配RoPE位置编码与Tokenizer映射、调优block_size与kv_cache_dtype等关键参数,实现单卡42 tokens/s高吞吐与112ms低延迟。内容覆盖环境验证、源码编译、模型权重转换、服务

weixin_34335458的博客 281

ClassLoader与Tomcat的ClassLoader

基本概念ClassLoaderClassLoad:类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class 类的一个实例。双亲委派机制什么时候需要加载类?java虚拟机规范虽然

小9的专栏 2637

在 Ubuntu 上安装和配置 PostgreSQL 实录

本文介绍了在Ubuntu系统上安装和配置PostgreSQL数据库的完整步骤。主要内容包括:1)通过官方源或PPA源安装最新版本;2)修改配置文件(postgresql.conf和pg_hba.conf)以允许远程访问;3)设置postgres用户密码;4)创建新用户并配置权限;5)防火墙设置和重启服务;6)验证安装和远程连接方法。文章提供了详细的命令行操作指导,帮助用户完成从安装到远程访问的全部配置过程。

qq_58168857的博客 1210

javaee加密部署项目通过tomcat使用自定义的classload解密

参考文章:http://blog.itpub.net/29754888/viewspace-1220306/ 如上述文章所说,继承tomcat的WebappClassLoader自定义自己的classload,并不适用于spring。 原因是spring加载类是用另外的方式来加载。 意思应该是是需要封装的jar代码中不能有spring的注解(依赖注入、控制器声明等等) 原理: 通

fuck487的博客 1931

TPL5010硬件看门狗电路

在做一些采集频率很低的产品的时候,会考虑电池供电,比如表、电气表等,为了控制功耗,往往会在设备不需要工作的时候让它进入低功耗模式。为了设备的稳定性,避免死机后无法恢复,必须配置看门狗,一般的看门狗芯片,喂狗间隔时间是几秒钟。这样在喂狗和低功耗之间就产生了一个矛盾,频繁的喂狗就需要频繁的醒过来,这样功耗就很难做到很低。这颗看门狗芯片,特别适合上面的应用。2小时的间隔意味着主控芯片每2小时醒过来喂狗一次即可,而在2.5V供电的情况下,功耗仅仅35nA,几乎可以忽略不计。

zxm8513优快云博客 3312

【fMRI实战】从fALFF/ReHo双样本t检验到GRF矫正:DPABI结果可视化与报告全流程

本文详细介绍了使用DPABI进行fMRI数据分析的全流程,包括fALFF/ReHo双样本t检验、GRF多重比较矫正、结果可视化与报告。重点讲解了DPABI Viewer的操作技巧、GRF参数设置要点、脑区定位方法以及结果提取与可视化技巧,帮助研究者高效完成fMRI数据分析与报告。

weixin_32612263的博客 417

Tomcat 的 ClassLoader

ClassLoader结构引入 ClassLoader cl = this.getClass().getClassLoader(); while(cl != null){ System.out.println(cl.getClass().getCanonicalName()); cl = cl.getParent(); } 将会打印以下内容 org.apach

wuhulala的休息室 1104

Halcon 3D点云匹配实战:从预处理到模板创建的完整流程(附代码)

本文详细介绍了Halcon在3D点云匹配中的实战应用,涵盖从预处理到模板创建的完整流程。通过代码示例和实用技巧,帮助开发者掌握点云采样、降噪、三角化等关键技术,并优化匹配参数以提高精度和效率。适用于工业检测、机器人引导等领域。

weixin_33670786的博客 433

Tomcat中ClassLoader一些小结

前提:Tomcat容器本身包装了几个ClassLoader。standardClassLoader用来加载容器本身,webappClassLoader用来加载项目class文件,并且有一个父子关系存在。 1. servlet 本身由WebappClassLoader 加载,从servlet中获得的ServletContext,HttpSession,HttpServletRequest均属于容器

u011385186的专栏 1766

手把手教你学Simulink——基于Simulink的多用户MIMO系统仿真建模示例

多用户MIMO概述在多用户MIMO系统中,基站配备多个天线,可以同时与多个用户进行通信。利用空间复用技术,不同用户的信号被分配到不同的空间流上,从而实现频谱资源的高效利用。多用户MIMO的核心挑战包括信道估计、波束成形设计以及干扰管理。关键技术点波束成形:通过调整发射信号的相位和幅度,在特定方向上增强信号强度并减少干扰。信道估计:获取每个用户的信道状态信息(CSI),用于优化波束成形矩阵。调制与解调:选择合适的调制方式(如QPSK、16-QAM等)以适应不同用户的信道条件。干扰消除。

MHD0815的博客 272

多角度模板匹配的模板创建技巧

基于形状的模板匹配多角度创建技巧

manuoo的专栏 3403

Classloader委任机制以及Tomcat中Classloader分析(整理)

参照网页 http://hi.baidu.com/qmiao128/item/c983bffca5ca6fec1b111f26 http://m.oschina.net/blog/144133 http://blog.youkuaiyun.com/feng2007110221053/article/details/7071823 Java中一共有四个类加载器,之所以叫类加载器,是程序要用到某个类的...

shensuqiao的专栏 243

读懂 SAP S/4HANA 里的 SAP Fiori 架构:前端服务器、搜索链路、传统应用接入与内容组织全景解析

摘要:SAP Fiori架构并非简单的系统连接图,而是明确区分界面层与业务数据层的三层分工体系:用户交互层(浏览器与Fiori launchpad)、前端技术层(SAPUI5运行环境)和业务数据层(SAP S/4HANA后端)。这种分离实现了生命周期解耦,前端专注于统一体验治理,后端处理核心业务逻辑。值得注意的是,SAP Fiori front-end server本质仍是ABAP系统,负责UI技术组件运行。虽然SAP S/4HANA推荐嵌入式部署,但独立部署在多系统场景中仍有价值。典型Fiori应用通过O

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 180

深入理解Tomcat类加载器原理

Tomcat类加载器体系通过多级加载器、部分委派和自定义实现,兼顾了应用隔离性、扩展性和热部署能力。理解其设计思想与源码实现,有助于高效排查类加载相关问题、优化应用架构,并为微服务、插件化等高阶场景打下坚实基础。知其然,更知其所以然,才能在实际开发中游刃有余,构建高可用、可维护的Java Web应用。速记口诀汇总委派流程:“先问爹,爹不会,才自己来。加载流程:“查缓存,问父亲,自己找,链接用。如有疑问,欢迎留言讨论!

IT技术学习与工作笔记分享 2201

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

class卸载、热替换和Tomcat的热部署的分析

这篇文章主要是分析Tomcat中关于热部署和JSP更新替换的原理,在此之前先介绍class的热替换和class的卸载的原理。 一 class的热替换 ClassLoader中重要的方法 loadClass       ClassLoader.loadClass(...) 是ClassLoader的入口点。当一个类没有指明用什么加载器加载的时候,JVM默认采用AppClassLoader

跳舞的驴子 703

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Tomcat7源码解读(四) —— 类加载器1

综述:在上一节中分析了Tomcat的执行过程。这一节将分析,Tomcat启动以及请求处理过程中所涉及到的类与对象,是由谁加载的,Tomcat的类加载器的特点。   4.1 JAVA的类加载过程 1)类加载load:从字节码二进制文件.class文件将类加载到内存将内存中的class放到运行时数据区的方法区内。类的初始化过程会在堆区建立一个java.lang.Class对象,用来封装该类相...

Rambing的专栏 280

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Tomcat启动时classloader加载顺序

   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/common...

dxp4598 240

玩转类加载和类加载器

一、类加载 类的生命周期 下图中这7个阶段必须记住,面试会问 阶段顺序 加载、验证、准备、初始化、卸载这5个阶段的顺序是固定的,解析阶段有时会在初始化之后执行 加载 类加载的时机在虚拟机规范中并没有明确的规定,但是加载需要做的事情如下: 通过类的全限定路径名获取这个类的二进制字节流 将二进制字节流中静态存储结果转化为方法区运行时数据结构 在内存中生成代表这个类的.class对象,作为这个类的各种数据结构的访问入口 验证 验证是为了保护虚拟机自身的安全,大致会完成下面4种检验动作: 文件格式验证 元数

u012781820的博客 300

java中三种常见内存溢出错误的处理方法

相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError的问题,这个问题曾困扰了我很长时间,随着解决各类问题经验的积累以及对问题根源的探索,终于有了一个比较深入的认识。 在解决java内存溢出问题之前,需要对jvm(java虚拟机)的内存管理有一定的认识。jvm管理的内存大致包括三种不同类型的内存区域:Permanent Generation space(永久保存区域)

cloudeagle_bupt的专栏 350

深入解析内存马技术:原理、检测与防御实践

内存马(Memory Shell)是一种高级攻击技术,通过将恶意代码直接注入目标进程的内存空间实现持久化访问。与传统的文件型木马不同,内存马不会在磁盘上留下可执行文件,这使得它更难被常规安全检测手段发现。其核心原理包括无文件驻留、进程寄生和动态加载等特性,主要应用于Web容器(如Tomcat、Jetty)和JVM环境。在攻防对抗中,内存马技术不断演进,出现了Servlet型、Filter型、Listener型等多种变种,其中Filter型由于能拦截所有请求而备受攻击者青睐。为有效应对这一威胁,需要结合静态检

weixin_30606461的博客 285

Tomcat与Jetty深度对比

Tomcat:规范完整、生态繁荣、运维成熟,是绝大多数 Java Web 项目的稳妥默认选择。Jetty:轻量、可嵌入、长连接友好、协议跟进快,是嵌入式与高并发连接场景的优选。我的部署形态是什么、我的连接模型是什么、我的团队最熟悉什么。想清楚这三点,答案通常就很清晰了。

流水账 368

Tomcat 简介与安装配置完整指南

Apache Tomcat是开源的轻量级JavaWeb应用服务器,实现Servlet、JSP等规范,广泛用于开发与部署中小型项目。其核心组件包括Catalina(Servlet容器)、Coyote(HTTP连接器)、Jasper(JSP引擎)等。安装需先配置匹配版本的JDK,解压Tomcat后修改端口、部署目录及安全配置。支持目录或WAR包部署应用,可通过Manager界面管理。注意版本与JDK兼容性(如Tomcat9用javax,Tomcat10+用jakarta),生产环境建议关闭自动部署、使用Ngin

xyouyuweizhu的博客 319

Java Tomcat 搭建 Web 网站实操教程(初学者版)

本文带你从零完成一次完整的 Java Web 网站搭建:装好 Tomcat、在 IDEA 里关联服务器、创建并部署 Web 项目、用浏览器访问页面,最后再解决新手最常踩的两个坑——404 找不到页面和端口被占用。全程只做必要操作,每一步都能跟着点完。

cats_eat_fish_的博客 106

Tomcat学习笔记

本文详细介绍了在RHEL 9系统上从零部署Tomcat集群的完整流程,包括JDK安装、Tomcat配置、systemd服务管理,并实现Nginx反向代理与Memcached会话共享。通过Nginx统一入口实现负载均衡,利用Memcached解决Session跨服务器共享问题,确保用户登录状态在多台Tomcat间保持一致,提升系统可用性与扩展性。

2401_84044881的博客 348
上一篇: 组态软件
下一篇: 了解ClassLoader
friendggz
博客等级 码龄23年 9粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值