以下内容部分来自网络,如有侵权,请站内联系。
Tomcat 下的工程,使用 WebappClassLoader 进行类的加载。查看 WebappClassLoader 源码,可以总结出 Tomcat 的类加载过程如下:
1. 先在自己(即当前 WebappClassLoader)的缓存中查找,有则返回,无则继续;
2. 再递归地在 parent 的缓存中查找,有则返回,无则继续;
3. 缓存中没有。尝试使用 sun.misc.Launcher$AppClassLoader 加载,成功则返回,失败则继续;
这样做的目的是,避免工程中重写了 Java 基础类,造成混乱。换句话说, webapp 下的 java.lang.* 等将被委托给上层的类加载器( ExtClassLoader 或 LaunchClassLoader 等)加载,这样就保证了基础类的安全。请放心,这里 sun.misc.Launcher$AppClassLoader 是不会加载到 webapp 中用户自定义的类的:我们知道 sun.misc.Launcher$AppClassLoader 是用来加载 classpath 中的类的,但 tomcat 消除了 classpath 的概念。
4. 一般情况下,调用自己的 findClass() 方法进行加载,成功则返回,失败则继续;
5. 若自己加载失败,递归请求 parent 进行加载;
6. 若最终都没能加载成功,则抛出 ClassNotFoundException 。
从4、5两步可以看出, Tomcat 的类加载过程和 Java 经典的类加载策略是有出入的,它在一定程度上破坏了双亲委派模型。这样做的目的是为了迎合 Servlet 规范,应用程序类的优先级要高于容器中类的优先级。
一个 WebappClassLoader 对应着一个 Web 应用程序,其父亲是 Tomcat 的 lib 的类加载器。所以 Tomcat 在默认情况下,不是完全按照先 Tomcat 的 lib 再 Web 应用的 lib 这种顺序去加载类的,正确的 Jar 包加载顺序是:
1. JRE 中的 Java 基础包;
2. Web 应用 WEB-INF\lib 下的包;
3. Tomcat\lib 下的包。
所以,如果想在 Web 应用间共享一些 Jar 包,不仅需要将公共包放在 Tomcat 的 lib 下,还要删掉 Web 应用 lib 下的包,否则 Tomcat 启动时还是会优先加载 Web 应用 lib 下的包的。
分享到:
相关推荐
这个"DevLoader.zip"文件可能包含与Tomcat自定义类加载器相关的资料,特别是名为"DevLoader"的类加载器,这可能是Tomcat为开发者提供的一种特殊加载器。 首先,我们来理解一下类加载器的基本概念。在Java中,类加载...
VSD文件可能包含一个流程图,详细描绘了Tomcat类加载器的工作流程和关系,这对于理解类加载机制非常有帮助。通过阅读和分析该文件,你可以更直观地了解每个类加载器的角色及其交互方式。 总之,理解Java类加载器和...
在Tomcat启动过程中,类的加载顺序是非常重要的一个环节,因为这直接影响到Web应用的正常运行以及类库冲突等问题。 #### 二、类加载机制概述 在Java中,类加载器(ClassLoader)负责将.class文件加载到JVM中。Tomcat...
Java 类在 Tomcat 中的加载过程是一个关键的环节,它涉及到如何有效地管理和执行Web应用程序的类。理解这一过程对于开发和调试基于Java的Web应用程序至关重要。以下是对标题和描述中所述知识点的详细解释: 1. **类...
因此,让Tomcat自动加载修改过的类和Servlet成为提高开发效率的关键需求之一。 ### 让Tomcat自动加载修改过的类和Servlet #### 知识点一:理解Tomcat的热部署机制 Tomcat默认情况下并不会自动检测到类或Servlet的...
动态加载是指在程序运行过程中,根据需要加载相应的类或模块,而不是在程序启动时一次性加载所有内容。在Web开发中,动态加载通常指的是服务器能够自动检测到应用的改动,并实时更新,而无需停止服务。 1. **...
### Eclipse Tomcat Server 加载...通过上述步骤,我们不仅完成了在Eclipse中配置和使用Tomcat服务器的过程,还详细了解了如何优化服务器性能、部署项目等内容。这对于进行高效、高质量的Java Web应用开发非常重要。
下面将详细解析Tomcat的类加载过程及其顺序。 #### 1. Bootstrap ClassLoader 这是JVM自带的类加载器,用于加载核心的类库,如`java.lang`、`java.util`等,这些类库存储在`$JAVA_HOME/jre/lib`目录下。Bootstrap ...
Tomcat 类加载器的实现主要围绕着Java的类加载机制进行,旨在确保应用之间的类隔离,并提供灵活的资源访问策略。下面我们将深入探讨这些知识点。 首先,Java的类加载机制是基于“双亲委托模型”的。当一个类加载器...
2. **Tomcat热加载原理**:传统的Java应用服务器在运行时,类加载到内存后,除非服务器重启,否则无法更改。Jrebel通过动态替换内存中的类文件来实现热加载,它监测源代码的变化,并将这些变化实时地推送到运行时...
总结来说,Tomcat的启动顺序是一个自底向上,从核心到应用的过程,依次加载Bootstrap、System、Common、Shared和WebApp类加载器,确保了服务的正确初始化和Web应用程序的隔离运行。理解这一启动流程对于调试、优化和...
Tomcat自动加载是关键,因为我们需要确保Quartz能在Tomcat服务器启动时正确初始化,并且在运行过程中能够响应XML配置文件的变更。在Tomcat中,我们可以使用ContextListener来监听应用的上下文初始化和销毁事件。在上...
5. "tomcat加载类的顺序.doc":详细说明了Tomcat加载类的具体步骤和顺序,这对于理解和调试类加载问题至关重要。 6. "Tomcat源码研究.pdf":提供了一个全面的源码分析概览,可能包括了Tomcat的主要组件、设计模式...
- Tomcat采用了一种层次化的类加载机制,该机制由多个不同的类加载器组成。 - 类加载器加载流程如下图所示: ``` +---------------------------+ |Bootstrap| | ||| | |System| | ||| | |Common| | |/\| |...
在这个特定的场景中,我们关注的是版本8.5.87的源代码,并且涉及到类加载器WebappClassLoaderBase的修改,目的是使得Tomcat能够支持加载经过加密的Web项目。 WebappClassLoaderBase是Tomcat中的核心类加载器,它...
理解Struts2在Tomcat中的加载过程有助于我们更好地进行Web应用开发和故障排查。 首先,让我们深入了解一下Struts2的核心组件: 1. **Filter Dispatcher**:Struts2的核心是`FilterDispatcher`,它是一个Servlet...
从 `Bootstrap` 类开始,逐步初始化类加载器、加载配置文件,直到启动服务器并监听端口,最终形成一个完整的 Tomcat 启动过程。这一过程不仅揭示了 Tomcat 内部工作原理,也为进一步理解和优化 Tomcat 配置提供了...
SpringBoot 类加载过程详解 在深入探讨Spring Boot的类加载过程之前,让我们先理解一下类加载的基本概念。Java中的类加载是由JVM(Java虚拟机)执行的,它负责将类的字节码加载到内存中,进行校验、解析,并准备类...
类加载器工作流程通常涉及以下几个步骤: 1. **加载**:加载阶段,类加载器找到指定类的字节码,这可以通过读取磁盘上的.class文件或从网络上获取。 2. **验证**:确保字节码符合Java语言规范,不会对JVM造成危害。 ...
这里,注释掉`<servlet-class>`标签内的Jetty类,或者直接删除整个servlet配置,以避免Jetty的DefaultServlet干扰Tomcat的静态资源处理。保存并重新部署应用后,应该能够正常访问静态资源。 此外,还有其他可能导致...