欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

tomcat 类加载机制

程序员文章站 2022-05-27 23:43:29
...
1.Tomcat 类加载器架构

Tomcat 服务器类加载要解决的问题:
1.同一个 tomcat 服务器下的不同应用所使用的类库可以实现隔离.
2.同一个 toncat 服务器下的不同应用所使用的类库可以互相共享.
3.服务器需要尽可能保证自身的安全不受部署的 web 应用程序影响(服务器使用到的类库应当和应用程序使用到的类库互相隔离).

在 Tomcat 目录结构中,有 3 组目录:/common/* /server/* /shared/* /WEB-INF/* 可以存放 java 类库.

/common/* 类库可被 tomcat 和所有引用程序共同使用
/server/* 类库可被 tomcat 使用,多所有的 web应用程序不可见
/shared/* 类库可被所有的 web 应用程序共同使用,但对 tomcat 自己不可见
/webapp/web-inf/ 类库仅仅可以被此 web 应用程序使用,对 tomcat 和其他web应用程序都不可见.



common classloader 加载 common 目录
catalina classloader 加载 server 目录
shared classloader 加载 shared 目录
webapp classloader 加载 web-inf
jsperLoader 加载 jsp 文件


在 Tomcat6.x 版本中,只有指定了 tomcat/conf/catalina.properties 配置文件的 server.loader 和 share.loader 项后才会真正建立 CatalinaClassLoader 和 SharedClassLoader 的实例,否则会用到这两个类加载器的地方都会用 CommonClassLoader 的实例代替. 而默认配置文件中没有设置这两个 loader 项,所以 Tomcat6.x 顺理成章的把 /common、/server 和 .shared 三个目录合并成了一个 /lib 目录.——相当于加载 /common 目录.

现在思考这么一个问题:如果有 10个应用程序都是用 Spring 来管理的,那么我们可以把 Spring 的基础包放到 common 或者shared 目录下让应用程序共享. Spring 要对用户程序进行管理,那么自然要访问到用户程序的类,而用户程序显然放在 /web-info 目录下,那么 CommonClassLoader 或 SharedClassLoader 如何访问不在其加载范围内的用户程序了?

答案是线程上下文类加载器.