Jetty是个servlet容器,要理解servlet容器的class loader,要先看 JSR315 servlet 3 中对web application class loader的要求,比较重要的地方加了中文解释。
10.7.2 Web Application Class Loader
The class loader that a container uses to load a servlet in a WAR must allow the
developer to load any resources contained in library JARs within the WAR following
normal Java SE semantics using getResource. As described in the Java EE license
agreement, servlet containers that are not part of a Java EE product should not allow
the application to override Java SE platform classes, such as those in the java.* and
javax.* namespaces,
不允许应用去覆盖JAVA SE的系统类
that Java SE does not allow to be modified. The container
should not allow applications to override or access the container’s implementation
classes.
不允许应用覆盖或存取容器的实现类
It is recommended also that the application class loader be implemented so
that classes and resources packaged within the WAR are loaded in preference to
classes and resources residing in container-wide library JARs. An implementation
MUST also guarantee that for every web application deployed in a container, a call
to Thread.currentThread.getContextClassLoader() MUST return a
ClassLoader instance that implements the contract specified in this section.
每个应用调用getContextClassLoader()返回的都应该是实现了本规范中定义的class loader。
Furthermore, the ClassLoader instance MUST be a separate instance for each
deployed web application.
每个应用的class loader必须要是独立的实例。
The container is required to set the thread context
ClassLoader as described above before making any callbacks (including listener
callbacks) into the web application, and set it back to the original ClassLoader,
once the callback returns.
WebAppClassLoader会对应一个WebAppContext,
Jetty 的WebAppClassLoader的具体实现,有些地方加了注释:
protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException { Class c= findLoadedClass(name); //查找已经载入的class ClassNotFoundException ex= null; boolean tried_parent= false; if (c == null && _parent!=null && (_context.isParentLoaderPriority() || isSystemPath(name)) ) //判断是否是parent优先模式或系统路径(WebAppContext中定义的_systemClasses, 如果是system class,则由父classloader完成载入) { tried_parent= true; try { c= _parent.loadClass(name); ... } ... } if (c == null) { try { c= this.findClass(name); //使用自定义的本地方法载入类 } ... } if (c == null && _parent!=null && !tried_parent && !isServerPath(name) ) //类未载入,父classloader不是空,没有用父classloader载入过,不是系统类 //则用父classloader载入尝试 c= _parent.loadClass(name); if (c == null) throw ex; if (resolve) resolveClass(c); return c; }
上面类加载器中系统类的定义根据包名划分,根据servlet规范,Jetty的web app classloader不会加载这些类:
private String[] _systemClasses = { "java.", "javax.", "org.mortbay.", "org.xml.", "org.w3c.", "org.apache.commons.logging.", "org.apache.log4j." };
判断是否是parent优先模式由WebAppContext中的一段来解决:
private boolean _parentLoaderPriority= Boolean.getBoolean("org.mortbay.jetty.webapp.parentLoaderPriority");
相关推荐
SpringBoot 类加载过程详解 在深入探讨Spring Boot的类加载过程之前,让我们先理解一下类加载的基本概念。Java中的类加载是由JVM(Java虚拟机)执行的,它负责将类的字节码加载到内存中,进行校验、解析,并准备类...
- 通过对Jetty源码的深入分析,可以发现其设计的核心理念在于简化Web应用的部署流程,同时保证高性能与灵活性。无论是对于初学者还是有经验的开发者来说,Jetty都提供了强大的工具与框架支持,帮助他们快速搭建起...
Jetty 的应用加载过程包括了多个步骤,包括加载 Web 应用、配置应用、初始化应用等。下面是 Jetty 的应用加载过程: 1. 加载 Web 应用:Jetty 通过读取 WAR 文件或目录来加载 Web 应用。 2. 配置应用:Jetty 通过...
5. **配置与启动流程**:跟踪源码中的配置加载和服务器启动过程,这有助于理解i-jetty的运行机制。 通过以上分析,我们可以了解到i-jetty作为一款开源的轻量级Web服务器,其源码不仅展示了Servlet容器的基本工作...
3. **Servlet容器实现**:源码揭示了Jetty作为Servlet容器的内部实现,包括请求和响应处理、Servlet的加载和管理、线程模型以及会话管理等核心功能。这有助于深入理解Servlet容器的工作机制。 4. **WebSocket支持**...
- `Servlet`: Jetty支持Servlet 3.1规范,源码中可以看到`ServletHandler`如何加载和管理Servlet,以及`ServletHolder`如何存储Servlet配置。 4. **配置与启动** 在源码中,你将看到如何通过`Server`实例来配置...
下面我们将深入探讨Jetty的核心组件、工作流程以及源码阅读的一些技巧。 1. **Jetty架构** - **Server**:Jetty的核心组件,负责管理多个`Connector`(连接器)和`Handler`(处理器)。`Server`对象启动和停止...
通过分析Jetty 6.1.26的源码,开发者可以深入理解Web服务器的工作原理,这对于优化性能、自定义行为或解决特定问题都有极大的帮助。同时,这也有助于开发者更好地过渡到Jetty的更新版本,因为许多基础架构和设计原则...
源码分析对于理解其工作原理、优化性能以及定制化开发有着至关重要的作用。在这个"jetty 源码 2018 zip"压缩包中,包含的是Jetty 9.4.10.RC1版本的源代码,这为我们提供了一个深入了解Jetty内部机制的机会。 首先,...
总的来说,这个手动加载的过程对于开发者来说是一个很好的学习机会,可以更好地理解Spring MVC与Jetty服务器之间的交互,以及Web应用的部署流程。通过这个实践,你将能够更熟练地配置和调试Spring MVC应用,无论是在...
对于源码分析和自定义扩展,还需要具备一定的Java编程基础,理解Servlet容器的工作原理。 总的来说,Jetty 6.1.9是一个功能强大的服务器平台,特别适合需要高效、轻量级解决方案的开发者。通过学习和使用这个版本,...
分析jetty技术的必备工具
类加载器(Class Loader)是Java语言的关键组成部分之一,它负责将Java类的字节码加载到Java虚拟机(JVM)中,从而使得Java应用程序能够运行起来。自Java诞生以来,类加载器的概念就一直存在,并随着Java技术的发展...
通过这种设计,Jetty实现了良好的类加载器层次结构,既保证了应用的隔离性,又提高了系统的灵活性。 #### 八、Jetty Connector **8.1 SSL的配置** Jetty支持通过SSL/TLS协议来加密HTTP连接,保障数据的安全传输。...
首先,理解OSGI的关键在于其模块化系统,每个模块称为一个bundle,它们有自己的类加载器,可以独立加载和运行。这种设计使得OSGI能够实现动态依赖管理和版本控制,为开发者提供了更细粒度的控制和更高的灵活性。 ...
这个压缩包“jetty-6.1.9服务器(1)”包含了Jetty 6.1.9的部分源码,可能是为了便于开发者学习和理解Jetty的工作原理。由于内容较大,所以被分成了多个部分,用户需要将所有部分合并才能得到完整的源码。 Jetty的...
### Jetty服务器性能调整过程分析 #### 一、目标 Jetty服务器采用了非阻塞I/O(NIO)加线程池的技术方案来实现在高并发场景下的高性能表现。本篇文章的目标是通过调整Jetty服务器的各项配置参数,来观察并评估其对...
6. **热部署**:除了自动重新加载外,Maven Jetty Plugin还支持类热替换,这意味着在运行时可以更新已加载的类,而无需重启服务器。 7. **与其他Maven插件协同工作**:与其他Maven插件如Surefire、Failsafe等配合...
2. **jetty-util-9.2.13.v20150730.jar**:这个库包含了各种通用的工具类和实用方法,对其他Jetty模块提供支持,如线程池管理、日志处理等。 3. **jetty-servlets-9.2.13.v20150730.jar**:这个模块提供了许多额外...
Jetty是一款轻量级、高性能的Java Web服务器和Servlet容器,它被广泛应用于各种规模的项目,从微型嵌入式应用到大型企业级系统。...通过分析Jetty的实现,你可以学习到如何设计和优化高并发、高性能的网络服务。