1:JDK的ClassLoader基础
Bootstrap ClassLoader/启动类加载器
主要负责jdk_home/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作。
Extension ClassLoader/扩展类加载器
主要负责jdk_home/lib/ext目录下的jar包或 -Djava.ext.dirs 指定目录下的jar包装入工作。
System ClassLoader/系统类加载器
主要负责java -classpath/-Djava.class.path所指的目录下的类与jar包装入工作。
User Custom ClassLoader/用户自定义类加载器(java.lang.ClassLoader的子类)
在程序运行期间, 通过java.lang.ClassLoader的子类动态加载class文件, 体现java动态实时类装入特性。
自User Custom向Bootstrap的检查类是否已经加载;自Bootstrap向User Custom的尝试加载类
JVM在加载类时默认采用的是双亲委派机制。通俗的讲,就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。关于虚拟机默认的双亲委派机制,我们可以从系统类加载器和标准扩展类加载器为例作简单分析。
2:Jetty的classloader
2.1:Jetty的classloader架构
web容器的classloader比普通java应用略为复杂。
每个web上下文(web应用和war文件)的普通配置是有自身的classloader,系统的classloader是它的父类。这是普通的java classloader的层次,但是servlet规范提出了负责的层次要求:
1. 在WEB-INF/lib和WEB-INF/classes中包含的类的加载优先级高于父classloader中的类。这和普通的java2的classloader加载动作相反。
2. 像java.lang.String这样的系统类不会被WEB-INF/lib或者WEB-INF/classes中的类替代。不幸的是,servlet规范并没有清楚的规定哪些类是系统类,也没有清楚的指出javax类应该作为系统类
3. Server实现类应该对web应用和其他classloader不可见。不幸的是,servelt规范并没有规定什么是server class ,也没有清楚的指出像xerces parser 这样的common libraries应该作为实现类。
2.2:如何配置classloading
jetty提供配置来控制以上三个选项。org.mortbay.jetty.webapp.WebAppContext.setParentLoaderPriority(boolean) 来控制所有类是否双亲委派的方式加载,这个配置解决了web应用加载的类在web应用和系统classpath同时存在的情况。
org.mortbay.jetty.webapp.WebAppContext.setSystemClasses(String[])和org.mortbay.jetty.webapp.WebAppContext.setServerClasses(String[])用来控制那些能够被web应用看到或者覆写的类。
* SystemClasses 不能被webapp 上下文 classloaders覆写. 默认的是:
* ServerClasses (on the container classpath) 不能被webapp 上下文 classloaders看到但是可以被webapp覆写. 默认配置是:
[这段不知道如何翻译]Absolute classname can be passed, names ending with . are treated as packages names and names starting with - are treated as negative matches and must be listed before any enclosing packages.
具体的类名可以不写,名称以.结尾代表是package名称,名称以"-"开头被认为是负面符号, and must be listed before any enclosing packages.
2.3:给jetty添加额外的classpaths
在启动时,jetty会自动加载$jetty.home/lib下所有的jars,随之加载在start.jar中的文件start.config中明确配置的子目录(例如:$jetty.home/lib/management,$jetty.home/lib/naming/ 等)中的jars。所以,给jetty添加拓展的jars,需要在$jetty.home/lib/ext中创建一个任何你想的深度的文件层次。当然,你可以在自己创建start.config来定义默认加载动作来代替系统动作,否则,你需要使用以下方法:
2.4:使用 jetty.class.path 系统属性
如果你想添加一个类目录或者jar到jetty,但是你不想把东西放到$jetty.home/lib/ext/中,或者你不想自己创建start.config文件,你可以简单的使用系统属性-Djetty.class.path,示例:
java -Djetty.class.path="../my/classes:../my/jars/special.jar:../my/jars/other.jar" -jar start.jar
2.5:在WebAppContext中使用extraClasspath()方法
如果你因为某种原因不想把jars或者classes放到 $jetty.home/lib ,同事也不想放到WEB-INF/lib 或者 WEB-INF/classes中,你可以把它添加到 $JETTY_HOME/contexts/mycontext.xml 文件中
<Configure class="org.mortbay.jetty.webapp.WebAppContext">
...
<Set name="extraClasspath">../my/classes:../my/jars/special.jar:../my/jars/other.jar</Set>
...
2.6:使用惯用的WebAppClassLoader
最后,没有其他替代方案满足你的需求,你可以在自己的webapp中定制classloader,建议你的classloader是 org.mortbay.jetty.webapp.WebAppClassLoader的子类,但这不是必须的。你可以像如下的方式配置自己的webapp的classloader:
MyCleverClassLoader myCleverClassLoader = new MyCleverClassLoader();
...
WebAppContext webapp = new WebAppContext();
...
webapp.setClassLoader(myCleverClassLoader);
相关推荐
Jetty 8.0.4 是一款轻量级的Web服务器和Servlet容器,它完全用Java语言编写,具有高度的可移植性和灵活性。这个版本在ETC目录下提供了配置文件jetty.xml,允许用户根据需求调整服务器的配置,例如修改默认的端口号,...
Jetty 8.0.4.v20111024是一款轻量级的Java Web服务器和Servlet容器,由Eclipse基金会维护。这个版本在2011年10月24日发布,旨在提供高效、灵活且可扩展的Web服务解决方案。Jetty的核心特性包括对HTTP协议的支持,...
jetty-security-9.4.8.v20171121.jar,jetty-io-9.4.8.v20171121.jar,jetty-continuation-9.4.8.v20171121.jar,jetty-client-9.4.8.v20171121.jar,jetty-jmx-9.4.8.v20171121.jar,jetty-plus-9.4.8.v20171121....
Jetty是一款轻量级、高性能的Java Web服务器和Servlet容器,它被广泛应用于各种规模的项目,从小型的个人项目到大型的企业级应用。Jetty以其高效、稳定和易于集成的特点,深受开发者喜爱。在本篇文章中,我们将深入...
Jetty的Handler体系结构相当丰富,包括HandlerWrapper和HandlerCollection两种主要类型。HandlerWrapper可以将一个Handler的职责委托给其他类执行,允许在调用Handler前后插入额外的操作,类似于Tomcat的Valve。...
5. **模块化设计**:Jetty的模块化结构允许开发者根据需求选择必要的组件,减少不必要的依赖,提高效率。 6. **WebSocket支持**:Jetty是最早支持WebSocket的服务器之一,提供了完善的WebSocket API,便于开发实时...
Jetty 8是一款轻量级、高性能的Java Web服务器和HTTP服务器容器,广泛用于开发、测试和部署Web应用程序。这个压缩包包含Jetty 8版本...同时,了解Jetty的依赖结构也能帮助你更深入地了解Java生态系统中的其他关键组件。
7. **部署和管理Web应用**:Jetty支持多种方式部署Web应用,包括WAR文件、目录结构、甚至直接从类路径加载。管理工具如jetty-admin和jetty-console可以帮助开发者监控和控制服务器状态。 8. **连接器和适配器**:...
Jetty是一款开源、轻量级的Web服务器和Servlet容器,被广泛用于开发、测试和部署Java Web应用程序。相较于Apache Tomcat,Jetty以其简洁的架构、高性能和低内存占用而受到开发者青睐。在选择Jetty时,必须考虑到与...
确保你的项目包含了必要的Web应用结构,如WEB-INF目录和web.xml配置文件。 2. **添加Jetty依赖:** 在项目的`pom.xml`(如果你使用的是Maven项目)或`build.gradle`(如果你使用的是Gradle项目)文件中,添加Jetty...
Jetty-all.jar是一个集合了众多Jetty组件的综合性JAR文件,它的主要目的是为了方便开发者在项目中快速引入和使用Jetty服务器。Jetty是一个开源的HTTP服务器和Servlet容器,它以其轻量级、高性能和易用性而受到广泛...
在Java开发领域,Maven和Jetty是两个非常重要的工具。Maven是一个项目管理工具,它可以帮助开发者管理和构建Java项目,而Jetty则是一个轻量级的嵌入式Servlet容器,常用于快速开发、测试以及部署Web应用。本文将详细...
Jetty 9.4.9 是一个开源的Java Web服务器和Servlet容器,以其轻量级、高效和灵活性而受到开发者的欢迎。这个版本是Jetty项目的一个重要里程碑,提供了许多性能改进和新特性。在深入探讨之前,让我们先了解一些基本...
本篇文章将深入探讨Jetty所需jar包的相关知识点,帮助你理解和配置Jetty运行环境。 首先,让我们了解Jetty的核心组件和它们对应的jar包: 1. **jetty-server.jar**:这是Jetty服务器的基础,包含了处理HTTP连接和...
Jetty是一款轻量级、高性能的Java Web服务器和Servlet容器,它被广泛用于开发、测试和部署Web应用程序。Eclipse是流行的Java集成开发环境(IDE),开发者可以利用它来管理和运行项目。本教程将详细介绍如何在Eclipse...
再者,jetty-util.jar是Jetty的一系列实用工具类库,提供了许多方便的辅助函数和数据结构,用于帮助开发者更高效地编写Web应用。这些工具类涵盖了字符串处理、日期时间操作、网络I/O、多线程同步等方面,极大地简化...
jetty-alpn-client-9.2.26.v20180806.jar jetty-alpn-server-9.2.26.v20180806.jar jetty-annotations-9.2.26.v20180806.jar jetty-cdi-9.2.26.v20180806.jar jetty-client-9.2.26.v20180806.jar jetty-continuation...
9. **模块化设计**: Jetty的模块化结构使得只加载需要的组件成为可能,从而减少了内存占用和启动时间。 10. **嵌入式使用**: 由于其小巧的体积和强大的功能,Jetty常被嵌入到其他Java应用中,作为内部的HTTP服务器...
Jetty 6.1.26是Jetty服务器的一个历史版本,它是一个开源的、轻量级的HTTP服务器和Servlet容器。与Tomcat相似,Jetty也被广泛用于开发和部署Web...了解它的结构和配置方法,有助于我们管理和维护基于Jetty的应用程序。
Jetty软件包内容: jetty-distribution-9.4.51.v20230217.tar.gz jetty-distribution-9.4.51.v20230217.zip jetty-home-10.0.15.tar.gz jetty-home-10.0.15.zip jetty-home-11.0.15.tar.gz jetty-home-11.0.15.zip ...