`
zhaohaolin
  • 浏览: 1012607 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Jetty 类加载器体系结构【转】

    博客分类:
  • JAVA
阅读更多

转载请注明出处 http://blog.csdn.net/lovingprince

 

-------------------------------------------------------------------------------------------------------------------------------

一般类加载器分三类:引导类加载器、扩展类加载器、系统类加载器

请见这里的分析 http://blog.csdn.net/lovingprince/archive/2009/07/02/4317069.aspx

 

请记住类加载器的几个特点:

1、  双亲委托

2、  全局负责

 

Jetty jetty_home/lib 下包含了 jetty 服务器运行所需要的 jar , jetty_home/lib/ext 下包含的服务器使用的一些扩展包,运行在 webapps 下特定应用的 WEB-INF/lib WEB-INF/classess 是各个应用自己的使用的类,特定应用自己的类当然不能与其他应用分享。

 

  •   系统类加载器

    Jetty 启动方式 java  -jar   start.jar (内部实际执行 org.eclipse.jetty.start.Main 类)

    那么这个 org.eclipse.jetty.start.M ain 是由哪个加载器加载的呢?很明显,这里没有其他的自定义类加载器,只有系统类加载器能够做这个工作。

 

  • 系统自定义加载器

Jetty 自定义了一个的 Loader 类加载器,以系统类加载器做为父加载器,完成对 start.config 配置文件的读取 ( 注意,这里只是读取,并没有实例化里面的类,只是使用类加载器来确定里面的 class 是否可用 )   

接下来, Jetty 有两种运行方式,一种进程内运行 ( 通过反射执行 MainClass), 一种是进程外执行 ( 通过 Runtime.getRuntime().exec()), 进程外执行时由于线程上下文不能进程之间传递,因此相当于我们直接使用如下方式直接执行:

  1. Java -Xms1636m -Xmx1636m -XX:PermSize=196m -cp /home/admin/jetty/lib/jetty-xml-7.1.6.v20100715.jar:/home/admin/jetty/lib/servlet-api-2.5.jar:/home/admin/jetty/lib/jetty-http-7.1.6.v20100715.jar:/home/admin/jetty/lib/jetty-continuation-7.1.6.v20100715.jar:/home/admin/jetty/lib/jetty-server-7.1.6.v20100715.jar:/home/admin/jetty/lib/jetty-security-7.1.6.v20100715.jar:/home/admin/jetty/lib/jetty-servlet-7.1.6.v20100715.jar:/home/admin/jetty/lib/jetty-webapp-7.1.6.v20100715.jar:/home/admin/jetty/lib/jetty-deploy-7.1.6.v20100715.jar:/home/admin/jetty/lib/jetty-servlets-7.1.6.v20100715.jar: /home/admin/jetty/lib/jetty-ajp-7.1.6.v20100715.jar:/home/admin/jetty/lib/jetty-jmx-7.1.6.v20100715.jar:/home/admin/jetty/lib/jsp/com.sun.el_1.0.0.v201004190952.jar:/home/admin/jetty/lib/jsp/ecj-3.6.jar:/home/admin/jetty/lib/jsp/javax.el_2.1.0.v201004190952.jar:/home/admin/jetty/lib/jsp/javax.servlet.jsp_2.1.0.v201004190952.jar:/home/admin/jetty/lib/jsp/javax.servlet.jsp.jstl_1.2.0.v201004190952.jar:/home/admin/jetty/lib/jsp/jetty-jsp-2.1-7.1.6.v20100715.jar:/home/admin/jetty/lib/jsp/org.apache.jasper.glassfish_2.1.0.v201007080150.jar:/home/admin/jetty/lib/jsp/org.apache.taglibs.standard.glassfish_1.2.0.v201004190952.jar:/home/admin/jetty/resources:/home/admin/jetty/lib/jetty-util-7.1.6.v20100715.jar:/home/admin/jetty/lib/jetty-io-7.1.6.v20100715.jar org.eclipse.jetty.xml.XmlConfiguration /home/admin/jetty/etc/jetty.xml /home/admin/jetty/etc/jetty-deploy.xml /home/admin/jetty/etc/jetty-logging.xml  

 

-cp 后是 classpath org.eclipse.jetty.xml.XmlConfiguration MainClass, 大家可以猜猜 org.eclipse.jetty.xml.XmlConfiguration 是哪个 ClassLoader 加载的?同样加载他的只能依靠系统加载器来完成。同时 classpath 中的 lib/ 中的类都由系统类加载器完成。

  

而进程内启动则不同,通过自定义的 Loader 加载器完成对 MainClass 的加载,通过反射方式运行 MainClass main() 方法,后续所有的 lib/ 中的类都以该自定义 Loader 做为加载器。

 

  • WebApp 自定义类加载器

上面我们说了 jetty 服务器 lib/ 中的 jar 都是系统自定义加载器加载的,如果让这个系统自定义加载器来加载 WEB-INF/lib WEB-INF/classes 下的类,那么在这个服务器下 WEB 应用之间可能就会相互影响了,并且服务器绝大多数时候并不需要应用 /WEB-INF/lib 下的类,于是 WebApp 自定义类加载器应运而生, Jetty 中默认叫 WebAppClassLoader

  1.    /** Constructor.  
  2.      */   
  3.     public  WebAppClassLoader(ClassLoader parent, Context context)  
  4.         throws IOException  
  5.     {  
  6.         super(new  URL[]{},parent!= null ?parent  
  7.                 :(Thread.currentThread().getContextClassLoader()!=null ?Thread.currentThread().getContextClassLoader()  
  8.                         :(WebAppClassLoader.class .getClassLoader()!= null ?WebAppClassLoader. class .getClassLoader()  
  9.                                 :ClassLoader.getSystemClassLoader())));  
  10. …….  
  11. }  

 

他是以当前线程上下文的 ClassLoader 为父 classloader, 如果上下文没有设定 classLoader ,俺么就使用加载 WebAppClassLoader 的加载器,如果还是没有,则采用系统类加载器。很明显,默认情况下,如果采用进程内运行,那么这个 parent 就是 Loader( 系统自定义类加载器 ) ,如果是进程外, parent 就是系统类加载器。

 

WebAppClassLoader 可以设定是否由 parent 优先加载 lib/ classes 下的类。

 

   Jetty ClassLoader 体系结构可以使用下图来简单表示:


分享到:
评论

相关推荐

    Eclipse+2BWeb开发+Java体系结构、工具、框架及整合应用+2B源代码(ch3-ch18)

    2. **Java体系结构**:Java体系结构包括JVM(Java虚拟机)、类加载器、垃圾收集机制等核心组件。理解这些概念有助于优化代码性能和内存管理。此外,了解JDK(Java Development Kit)和JRE(Java Runtime Environment...

    jboss-presentation

    类加载器的设计对应用服务器的性能和稳定性至关重要,JBoss通过层次化的类加载器体系结构来优化资源利用,减少内存占用并提高加载速度。 ### 日志配置 最后,文档强调了日志配置的重要性。合理的日志配置不仅有助...

    Eclipse使用教程

    Eclipse有自己的类装入机制,它与标准JVM有所不同,能够支持插件体系结构。Eclipse类装入器允许开发者自定义类路径,使得在开发和调试过程中可以方便地替换或扩展类。理解类装入器的工作原理,有助于解决类冲突、...

    应用服务架构及调优

    创建类加载器。 3. 加载服务并部署应用程序。 - **体系架构**:Tomcat架构简单明了,易于部署和维护。 ##### Jetty架构体系 Jetty是一款轻量级的Web服务器,适用于嵌入式环境。 - **目录结构**: - `bin`:...

    E3.Resource参考手册

    比如,可以编写自己的资源加载器来支持动态生成的资源,或者定制资源处理器以实现特定的编码转换。 通过以上详细解析,我们可以了解到E3.Resource作为一个强大的静态资源管理工具,它的功能涵盖资源加载、处理和...

    JFinal-1.1.0 api

    5. **插件体系结构**:采用插件体系结构,便于功能的扩展和定制。 6. **多视图支持**:支持多种视图技术,如FreeMarker、JSP、Velocity,满足不同场景的需求。 7. **Validator功能**:内置强大的Validator后端校验...

    Java 性能优化实战 21 讲

    4. **类加载机制**:分析类加载过程,双亲委派模型,以及如何利用类加载器进行优化。 5. **并发编程优化**:理解Java并发库,如线程池(ThreadPoolExecutor)、Future、Callable、Lock接口,以及如何避免死锁、活锁...

    JFinal-手册-1.2.pdf

    7. 插件体系结构:支持多种插件,具有很强的扩展性。 8. 多视图支持:同时支持FreeMarker、JSP、Velocity等模板引擎。 9. 强大的后端校验功能(Validator):提供了全面的验证机制。 10. 功能全面:基本上拥有Struts...

    jfinal学习手册

    9. JFinal架构及扩展:这部分概述了JFinal架构的各个方面,包括其核心特性、组件、插件体系结构以及如何进行扩展。 JFinal的手册提供了一个完整的学习指南,从入门基础到高级特性,都进行了详细的介绍,以帮助...

    JFinal-1.1.3-手册

    JFinal的主要特点包括MVC架构、遵循COC原则、ActiveRecord支持、自动加载修改后的java文件、AOP支持、Plugin体系结构、多视图支持、强大的Validator后端校验功能和无第三方依赖。 在快速上手指南中,首先介绍了如何...

    深入分析java web

    了解Class文件的内部结构,如常量池、字段表、方法表等,有助于理解类加载机制和字节码执行。 5. **JVM(Java虚拟机)**:这是Java程序运行的平台,深入理解JVM的工作原理对于性能调优至关重要。这部分可能涵盖类...

    JFinal1.8文档

    - MVC架构:JFinal采用模型-视图-控制器(MVC)的设计模式,使得开发结构清晰、易于理解。 - 无XML配置:遵循约定优于配置(COC)的原则,JFinal几乎无需XML配置文件,简化了项目的初始化过程。 - ActiveRecord模式...

    SCWCD模拟题合集

    这个认证针对的是Servlet和JSP(JavaServer Pages)技术,是Java EE(Enterprise Edition)认证体系中的一个重要组成部分。SCWCD模拟题合集是一个宝贵的资源,对于准备这项考试的考生来说,它提供了大量的实践题目和...

    JSP微商城系统开发视频教程

    - 控制器类的定义; - HTTP请求方法(GET/POST)的选择; - 请求参数的获取与传递; - 跳转至前端页面或返回JSON数据。 - **应用场景**: - 负责处理用户的HTTP请求,并调用业务层的方法。 - **前端页面设计...

    敏捷开发及服务集群

    6. Plugin体系结构,提供良好的可扩展性。 7. 多视图支持,兼容FreeMarker、JSP等模板引擎。 8. Validator后端校验功能,确保数据的有效性。 9. 体积小巧,无第三方依赖,便于分发与部署。 SpringBoot是一个简化...

    Servlet工作原理问答共2页.pdf.zip

    7. **Servlet的继承体系**:`GenericServlet`是所有Servlet的基类,它实现了`Servlet`和`ServletConfig`接口。`HttpServlet`是`GenericServlet`的子类,专门处理HTTP请求,提供了一些默认的处理方法,如`doGet()`、`...

    Java.Web开发学习手册.zip

    理解类与对象的关系、继承和多态的概念,以及如何利用接口实现模块间的解耦,这些都是构建Java Web应用的基础。 2. **Servlet**:Servlet是Java Web应用程序的核心组件,用于处理HTTP请求和响应。理解Servlet生命...

Global site tag (gtag.js) - Google Analytics