tomcat context.xml文件配置<Loader delegate="true" />作用

本文深入解析了Tomcat中ClassLoader的继承层次结构,包括SystemClassLoader、CommonClassLoader、ServerClassLoader、SharedClassLoader和WebAppClassLoader,并详细解释了它们在加载类文件过程中的角色和区别。同时,阐述了delegate配置对WebAppClassLoader加载行为的影响,提醒开发者注意避免可能导致类冲突或版本不一致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        原文地址:http://segmentfault.com/q/1010000000155690


        简而言之,JVM的classloader加载继承关系分为BootstarpClassLoader --> ExtClassLoader --> 

SystemClassLoader,应用的WebAppClassLoader继承自SystemClassLoader,在加载具体某个类

时,一般会先委托给父类ClassLoader,当父类ClassLoader无法加载成功时,才会再由子类ClassLoader

尝试加载,这就是所谓的delegate机制。

        其次,Tomcat在jvm的ClassLoader机制上增加了几个继承层次。

SystemClassLoader --> CommonClassLoader -->(ServerClassLoader | SharedClassLoader --> 

WebAppClassLoader)。CommonClassLoader用来加载${CATALINA_HOME}/conf/catalina.properties中

common.loader配置目录下的类文件,一般是用来加载${CATALINA_HOME}/lib下的文件。该loader加载

的类为tomcat服务器和tomcat

        下面的所有webApp所共享。

        ServerClassLoader用来加载${CATALINA_HOME}/conf/catalina.properties中server.loader配置目录

的类文件,一般是用来加载${CATALINA_HOME}/server下的文件。该loader加载的类为tomcat服务器所独

有核心类,tomcat下面的WebApp无法访问。

        SharedClassLoader用来加载${CATALINA_HOME}/conf/catalina.properties中shared.loader配置目

录下的类文件,一般是用来加载${CATALINA_HOME}/shared下的文件。该loader加载的类为tomcat下

面的所有webApp所共享。WebAppClassLoader用来加载${CATALINA_HOME}/webapps/目录下每个

WebApp应用的/WEB-INF/class,/WEB-INF/lib的类文件,每个WebApp对应一个WebAppClassLoader,

用来加载其所需要的类文件。

        最后,说一下delegate配置的意义。

        True,表示tomcat将遵循JVM的delegate机制,即一个WebAppClassLoader在加载类文件时,会

先递交给SharedClassLoader加载,SharedClassLoader无法加载成功,会继续向自己的父类委托,一

直到BootstarpClassLoader,如果都没有加载成功,则最后由WebAppClassLoader自己进行加载。

        False,表示将不遵循这个delegate机制,即WebAppClassLoader在加载类文件时,会优先自己尝

试加载,如果加载失败,才会沿着继承链,依次委托父类加载。

        在此说一下配置为False需要注意的问题:一旦配置为False,如果你在WebApp中自己定义了一个

java.lang.String,则这个String类会有可能覆盖掉jdk中的String类,这也许不是你想要的结果。另外对于

多个WebApp公用jar包,你可能会放到${CATALINA_HOME}/shared目录中共享,但是一不小心在应用

的/WEB-INF/lib中也包含了一个同名的但版本不一致的jar的话,这就有可能会导致很多奇怪的问题。


我的代码jar包可以正常运行,改成war包后就报错21-Mar-2025 09:12:03.251 严重 [localhost-startStop-1] org.apache.catalina.core.StandardContext.filterStart 启动过滤器异常[logicAuthFilter] javax.naming.NamingException: 无法创建资源实例 at org.apache.naming.factory.FactoryBase.getObjectInstance(FactoryBase.java:98) at java.naming/javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:342) at org.apache.naming.NamingContext.lookup(NamingContext.java:846) at org.apache.naming.NamingContext.lookup(NamingContext.java:157) at org.apache.naming.NamingContext.lookup(NamingContext.java:834) at org.apache.naming.NamingContext.lookup(NamingContext.java:171) at org.apache.catalina.core.DefaultInstanceManager.lookupFieldResource(DefaultInstanceManager.java:527) at org.apache.catalina.core.DefaultInstanceManager.processAnnotations(DefaultInstanceManager.java:437) at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:164) at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:143) at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:252) at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:100) at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4290) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4925) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:710) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:687) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:660) at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1018) at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1912) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) at java.base/java.util.concurrent
03-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值