首页 > 其他分享 >tomcat 双亲委托机制

tomcat 双亲委托机制

时间:2023-04-13 17:00:39浏览次数:39  
标签:类库 name 委托 ClassLoader jar String 双亲 tomcat 加载

tomcat 著名的双亲委托机制

  • 就是有类需要加载时就委托父类去加载 一直到顶级的 Bootstrap 都没有自己才加载 ,自己也没有就报错

类加载器

  1. Bootstrap ClassLoader:JVM内置的类加载器,用来加载Java核心类库,例如rt.jar、resources.jar等等。
  2. Extension ClassLoader:用来加载Java扩展类库,例如jre/lib/ext目录下的jar包。
  3. Common ClassLoader:主要用于加载Tomcat共享的类库,例如Tomcat中的servlet-api.jar和jsp-api.jar等,这些类库被所有的Web应用程序共享,因此需要通过一个公共的类加载器来加载
  4. System ClassLoader:也称为应用程序类加载器(Application ClassLoader),用来加载系统类和应用程序类,例如用户自定义的类和第三方库中的类。
  5. WEB Application ClassLoader:Web应用程序创建一个独立的类加载器,这样可以保证每个Web应用程序之间的类和资源相互隔离,互不干扰。

什么情况需要打破双亲委托机制

  • 每个web Application 依赖的上级类名称一致但是版本不一样

如何打破双亲委托机制

  • 继承URLClassLoader或者ClassLoader类,然后重写loadClass()方法
  • 自己加载时就从自己路劲加载 没有时候就从父类加载 super.loadClass()
实例代码
public class CustomClassLoader extends ClassLoader {
    private String classPath;

    public CustomClassLoader(String classPath) {
        this.classPath = classPath;
    }

    @Override
    protected Class<?> loadClass(String name, boolean resolve)
            throws ClassNotFoundException {
        synchronized (getClassLoadingLock(name)) {
            // 首先尝试从自定义的类路径中加载类
            Class<?> c = findClass(name);
            if (c != null) {
                if (resolve) {
                    resolveClass(c);
                }
                return c;
            }

            // 如果自定义的类路径中不存在该类,则调用父类加载器进行加载
            return super.loadClass(name, resolve);
        }
    }

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        // 从指定路径或者jar包中加载类
        byte[] classBytes = loadClassBytes(name);
        if (classBytes == null) {
            throw new ClassNotFoundException(name);
        }

        // 定义类
        Class<?> c = defineClass(name, classBytes, 0, classBytes.length);
        if (c == null) {
            throw new ClassNotFoundException(name);
        }

        return c;
    }

    private byte[] loadClassBytes(String name) {
        // 实现从指定路径或者jar包中加载类文件的逻辑
        // 省略具体实现细节
    }
}

标签:类库,name,委托,ClassLoader,jar,String,双亲,tomcat,加载
From: https://www.cnblogs.com/guanchaoguo/p/17315460.html

相关文章

  • 如何访问tomcat中的项目
    访问tomcat中web项目将java项目打成war后,放入webapps目录中,然后在bin目录中找到startup.bat,因为我是在windows环境中演示,所以用bat结尾的脚本启动tomcat,关闭的脚本是shutdown.bat。如果是在Linux环境下,则使用startup.sh脚本启动,关闭的脚本是shutdown.sh。将tomcat启动后,tomca......
  • 关于Tomcat服务器的目录
    关于Tomcat服务器的目录bin:这个目录是Tomcat服务器的命令文件存放的目录,比如:启动Tomcat,关闭Tomcat等。conf:这个目录是Tomcat服务器的配置文件存放目录。(server.xml文件中可以看到配置端口号,默认Tomcat端口号8080)lib:这个目录是Tomcat服务器的核心程序目录,因为Tomcat服务器是j......
  • nginx+tomcat双端口实现负载均衡
    nginx基础配置---点击tomcat基础配置---点击上述配置完成之后进行对tomcat配置不同端口tomcat设置端口#移动tomcat设置两个主目录[root@lyxlocal]#mvapache-tomcat-8.5.79tomcat-home[root@lyxlocal]#cp-Rtomcat-hometomcat-8080[root@lyxlocal]#cp-Rtomcat-home......
  • Tomcat彻底卸载干净
    1.首先直接删除原来的文件2.打开注册表 3.全局搜索Tomcat,删除对应的注册表4.之后以管理员身份打开任务管理器,输入scdeletetomcat10删除全部 ......
  • 关于Tomcat9和Tomcat10的了解
    就离谱在我使用Tomcat10之前,我是没有想到9和10的差距可以这么大!习惯了使用Maven项目以及版本9的Tomcat,将相关的依赖习惯于导成javax;使用10的时候,html页面怎么也跳转不到servlet后台里面去,就很麻;找了好久,才找到解决办法:版本不同,导的包需要从原来的javax换乘jakarta全部推翻重......
  • Delphi 调用 c# 动态库-委托实现回调
    由于Delphi的局限性,有时候有的功能可能无法实现,需要借助与其他语言实现,比如C#,这里演示一下Delphi如何调用C#动态库c#作为面向对象语言,其中所有的定义和Java一样,一切皆对象,因此在编写动态链接库的时候需要符合com标准,而委托作为方法的指针,在Delphi中调用需要把Delphi中声......
  • docker 部署 tomcat
    拉取tomcat镜像dockerpulltomcat:latest运行tomcatdockerrun-d-p8090:8080--nametomcat_doc-v/root/web/:/usr/local/tomcat/webappstomcat:latest......
  • Tomcat安装
    一、安装1、安装包下载https://archive.apache.org/dist/tomcat/tomcat-10/v10.0.6/bin/2、将apache-tomcat-10.0.6.tar.gz上传至/opt/softmkdir-p/opt/softmkdir-p/opt/module3、解压tar-zxvf/opt/soft/apache-tomcat-10.0.6.tar.gz-C/opt/module4、启......
  • 在Ubutu(14.10)的Eclipse启动Tomcat,以及部署问题
    启动Tomcat安装了阿土14.10(启动盘报gfxboot.c32:notaCOM32Rimage,网上查得输入live,果然可以,对此解决方式只能说),想装一个javaservlet的环境,下载了eclipse,通过apt-getinstall安装了tomcat和openjava。但是在运行时,RunOnServer中ServerName无法显示,导致无法运行。根据网上的指......
  • 将Vue项目部署到Tomcat服务器上(简单、粗暴)
    1.将项目打包Vue中自带webpack,可以通过一行命令将项目打包#执行该命令打包npmrunbuild2.上传相应文件到服务器上打包完成后,项目中会多出一个dist文件夹,这个文件夹中就包含html、css、js等文件直接将dist文件夹上传到Tomcat的ROOT目录下,默认情况下,访问服务器网址......