`

Tomcat的Classloader

阅读更多
Tomcat的启动是从解析bat文件开始,bat文件最终调用org.apache.catalina.startup.Bootstrap开始类的加载。 
commonLoader = createClassLoader("common", null);
 if(commonLoader == null)
   commonLoader = getClass().getClassLoader();
   catalinaLoader = createClassLoader("server", commonLoader);
   sharedLoader = createClassLoader("shared", commonLoader);

这是org.apache.catalina.startup.bootstrap;的代码

初始化Classloader的一个过程
如果跟踪看createClassLoader
调用自身的方法 createClassLoader,最终是执行ClassloaderFactory的方法
if(parent == null)
     classLoader = new StandardClassLoader(array);
 else
     classLoader = new StandardClassLoader(array, parent);
   return classLoader;


parent就是上面传递的commLoader
其实他们的parent的class是org.apache.catalina.loader.standardClassLoader
只是他们的名字是 上面的名字
例如 commentloader加载的类  getClassLoader是stanardClassLoader
standardClassLoader是URLClassloader的子类
(URLClassloader是java.security.SecureClassLoader的子类,java.security.SecureClassLoader
是Classloader的子类  java.security.SecureClassLoader扩展了Classloader,他还可以支持使用相关的代码源和权限定义类)
+---------------------------+
       |         Bootstrap         |
       |             |             |
       |          System           |
       |             |             |
       |          Common           |
       |         /      \          |
       |     Catalina Shared      |
       +---------------------------+
下面是各自的只能

- Bootstrap -
载入JVM自带的类和$JAVA_HOME/jre/lib/ext/*.jar
- System   
1.载入$CATALINA_HOME/bin/bootstrap.jar 初始化Tomcat,执行Main方法
2. $JAVA_HOME/lib/tools.jar Sun的工具类,包括编译Jsp为Servlet的工具类
- Common    
这个目录下的类虽然对TOMCAT和所有的WEB APP都可见.但是Web App的类不应该 放在这个目录下,所有未打包的Class都在$CATALINA_HOME/common/classes下,所
  有打包的jar都在 $CATALINA_HOME/commons/endorsed $CATALINA_HOME/common/lib下,默认情况会  包含以下几个包:
1. jndi.jar JNDI API接口,这个包仅在Java1.2时候装入,1.3以后的版本JDK已
自动装入.
2. naming-common.jar JNDI接口实现类,Tomcat用这些类在内存中使用Context.
3. naming-resources.jar JNDI实现,Tomcat用它们定位Web App的静态资源.
4. servlet.jar Servlet,Jsp API
5. xerces.jar XML解析器,特定的Web App可以在自己的/WEB-INF/lib 中覆盖.
- Catalina
装入Tomcat实现所有接口的类,这些类对Web App是完全不可见的,所有未打包的类在 $CATALINA_HOME/server/classes所有jar包在$CATALINA_HOME/server/lib下.一 般情况该ClassLoader将Load下面几个包:
                 1. catalina.jar Servlet容器的Tomcat实现包
                    2. jakarta-regexp-X.Y.jar 正则表达式,请求过滤时使用
                    3. servlets-xxxxx.jar Servlet支持包
                    4. tomcat-coyote.jar Tomcat的Coyote连接实现包
                    5. tomcat-jk.jar Web Server绑定包,允许Tomcat绑定Apache等作为Web Server
                 6. tomcat-jk2.jar 功能同上
                    7. tomcat-util.jar Tomcat工具类,可能被一些Connector用到
                    8. tomcat-warp.jar 用于Apache Server包
- Shared  
载入所有WEB APP都可见的类,对TOMCAT不可见. 所有未打包的类在
  $CATALINA_HOME/shared/classes所有jar包在$CATALINA_HOME /lib下.
默认情况包含下面几个包:
1. jasper-compiler.jar Jsp编译器,编译Jsp为Servlet
2. jasper-runtime.jar Jsp(已编译成Servlet)运行支持包
3. naming-factory.jar 支持Web App使用JNDI的封装包-WebAppX   Web App ClassLoader,当Web App被部署是该ClassLoader被创建.所有class都在 WEB-INF/classes下,所有jar在WEB-INF/lib下.
 
特别注意WEB APP自己的ClassLoader的实现与众不同:
它先试图从WEB APP自己的目录里载入,如果失败则请求父ClassLoader的代理
这样可以让不同的WEB APP之间的类载入互不干扰.另,Tomcat Server使用的是Catalina  
ClassLoader,一般的Web App使用的是WebApp ClassLoader.
分享到:
评论

相关推荐

    Tomcat研究之ClassLoader.pdf

    Tomcat研究之ClassLoader.pdf 请大家抓紧下载吧,呵呵

    Tomcat 5.0.18 ClassLoader source code insight

    NULL 博文链接:https://davyjones2010.iteye.com/blog/2226286

    tomcat 类加载机制 —— ClassLoader

    NULL 博文链接:https://yjhexy.iteye.com/blog/668334

    3-7Tomcat中自定义类加载器的使用与源码实现(1).mp4

    3-7Tomcat中自定义类加载器的使用与源码实现(1).mp4

    Tomcat.ClassLoader.rar_Java编程_Java_

    详细讲解java classloader知识和tomcat中的类加载机制

    Tomcat自带的日志实现是tomcat-juli.jar

    Tomcat自带的日志实现是tomcat-juli.jar,它是对默认的JDK日志java.util.logging进行...但是tomcat-juli可以针对不同的classloader来使用不同的配置文件,使得tomcat下不同的Web应用程序可以使用各自独立的日志文件。

    Tomcat加载顺序

    Tomcat加载顺序。加载方法以及加载的顺序。

    tomcat-7_API_帮助文档

    * tomcat-jdbc.jar (Tomcat's database connection pooling solution) * tomcat-util.jar (Various utilities) * websocket-api.jar (WebSocket 1.1 API) You can make additional APIs available to all of your ...

    tomcat-8_API

    * tomcat-jdbc.jar (Tomcat's database connection pooling solution) * tomcat-jni.jar (Interface to the native component of the APR/native connector) * tomcat-spdy.jar (SPDY implementation) * tomcat-util...

    Tomcat中tcnative-1文件.7z

    at java.lang.ClassLoader$NativeLibrary.load(Native Method) /******************************/ 解决方法 /*****************************/ 将tomcat目录下的bin文件中的tcnative-1.dll文件替换为64位

    spring-instrument-tomcat-4.3.14.RELEASE.jar

    Tomcat's WebappClassLoader is currently not instrumentable, so Spring provides a custom ClassLoader that can be used by placing spring-instrument-tomcat.jar in $TOMCAT_HOME/lib and putting a loader ...

    JAVA加密工具

    假设您的Java Web Server为Tomcat,以Windows平台为例,Tomcat的存放目录为C:\Tomcat 5.5 ,classloader.dll存 放在c:\windows目录中,在Tomcat的bin目录中新建一个文件setenv.bat,setenv.bat中的内容:set JAVA_...

    Tomcat 类加载器的实现方法及实例代码

    Tomcat 内部定义了多个 ClassLoader,以便应用和容器访问不同存储库中的类和资源,同时达到应用间类隔离的目的。 1. Java 类加载机制 类加载就是把编译生成的 class 文件,加载到 JVM 内存中(永久代/元空间)。 类...

Global site tag (gtag.js) - Google Analytics