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也不会受理。
引用地址:
http://spaces.msn.com/myj1024/blog/
分享到:
相关推荐
5. **直接内存** - **作用**:非JVM规范定义,但被频繁使用,如NIO的DirectByteBuffer,用于堆外内存分配。 - **异常**:过度使用可能导致`OutOfMemoryError`。 6. **运行时常量池** - **作用**:方法区的一部分...
Java 类加载机制是Java语言的核心特性之一,它允许程序在运行时动态加载和解析类,极大地增强了灵活性和可扩展性。本文将详细讲解类加载的基础知识、Java虚拟机(JVM)如何使用类加载器以及如何自定义类加载器。 ...
首先,我们需要理解Java的类加载机制。在Java中,类加载器负责查找并加载类的字节码文件(.class)。默认情况下,系统类加载器会根据类的全限定名在ClassPath中查找对应的.class文件。但是,如果我们想要在运行时...
破解java加密的ClassLoader.java,在classloader植入破解代码
理解ClassLoader的工作机制对于深入掌握Java应用程序的运行至关重要。这里我们将详细讨论ClassLoader的运行机制,特别是自定义ClassLoader的设计与实现。 ClassLoader的基本职责是根据类名动态加载对应的类文件。在...
- **OSGi**:OSGi是一个Java平台的模块化框架,它通过类加载器机制实现了严格的模块化隔离,使得不同的模块之间可以动态加载、卸载以及更新,极大地提高了系统的灵活性和可维护性。 #### 结论 类加载器是Java生态...
关于类加载器的 上课ppt -java虚拟机自带的加载器 根类加载器(Bootstrap) c++写的看不到扩展类加载器(extension) 系统类加载器(System) AppClassLoad 用户自定义的类加载器 Java.lang.ClassLoader的子类
使用反射机制来执行恶意代码,同时利用 Java 的网络编程能力将结果发送出去。 - **步骤三:实现回显** 当反序列化这个特殊对象时,它会自动执行命令并将结果发送给预设的地址。 #### 实战案例 假设我们有一个...
这一机制是Java远程方法调用(RMI)、企业JavaBeans(EJB)、Java Native Interface(JNNI)等关键技术的基础。 #### 1.1 序列化技术基础 为了让一个Java类支持序列化,需要使其实现`java.io.Serializable`接口。值得...
面试必考之HashMap源码分析与实现 探索JVM底层奥秘ClassLoader源码分析与案例讲解 面试必备技能之Dubbo企业实战 ...互联网系统垂直架构之Session解决方案 分库分表之后分布式下如何保证ID全局唯一性 ...
在《Java虚拟机类加载机制》一文中详细阐述了类加载的过程,并举了几个例子进行了简要分析,在文章的后留了一个悬念给各位,这里来揭开这个悬念。建议先看完《Java虚拟机类加载机制》这篇再来看这个,印象会比较深刻...
在java中 当你用一个类加载器 去加载一个类的时候 这个类里面所有的出现的过得类 都会通过这个类加载器加载在这个类后续 的操作中,只要是有由这个类衍生出的 那么涉及的类 都由这个类加载器进行加载 该类加载器为...
5. 自己从classload 加载方式,加载机制说开去,从程序运行时数据区,讲到内存分配,讲到String常量池,讲到JVM垃圾回收机制,算法,hotspot。 JVM的类加载机制包括加载、链接和初始化三个阶段,String常量池是JVM中...
JBoss 5是一款知名的Java应用服务器,其在类加载(Class Loading)方面有着独特的处理方式。随着OSGi(Open Services Gateway Initiative)风格的类加载机制逐渐流行,以及新的Java模块和类加载规范的出现,JBoss对...
Java虚拟机工具接口(JVMTI,Java Virtual Machine Tool Interface)是Java开发工具包(Java SDK)的一个核心组件,自Java 2 SDK Standard Edition 1.5.0版本起引入,用于替代实验性的JVMPI(Java Virtual Machine ...
JavaSE ...│ ├─classLoad │ │ ├─ClassCypher.java │ │ ├─ClassLoadDemo.java │ │ ├─EncryptedCalss.java │ │ └─MyClassLoad.java │ └─designPattern │ ├─decorator <d
在Java开发领域,Maven作为一款强大的项目管理和构建工具,扮演着举足轻重的角色。然而,随着项目的复杂度增加,类加载问题时常困扰着开发者。本文将深入探讨"Maven-classloader-plugin",一个专为解决Maven插件中的...
ClassLoader是Java中的一种机制,用于加载类和资源。Spring Boot中的ClassLoader继承关系主要涉及到三个ClassLoader,它们分别是BootstrapClassLoader、ExtClassLoader和AppClassLoader。 在Spring Boot应用程序中...