`
fhqibjg
  • 浏览: 53937 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

Jetty8.0.4的ClassLoader的体系结构

 
阅读更多

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的尝试加载类

 //检查类是否被装载过
      Class c = findLoadedClass(name);
      //指定类未被装载过,自顶部向下的尝试加载类
      if (c == null) {
          try {
            //如果父类加载器不为空,指定为父类加载器加载
            if (parent != null) {
                c = parent.loadClass(name, false);
            } else {
                //在父类加载器为空的情况下,指定为系统启动类加载(native),不存在则返回null
                c = findBootstrapClassOrNull(name);
            }
          } catch (ClassNotFoundException e) {
                // ClassNotFoundException thrown if class not found
                // from the non-null parent class loader
            }
            if (c == null) {
              // If still not found, then invoke findClass in order
              // to find the class.
              c = findClass(name); //通过自己的findClass来加载类
          }
      }
      if (resolve) {
          resolveClass(c);//用来做类链接操作
      }

     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覆写. 默认的是: 

{"java.","javax.servlet.","javax.xml.","org.mortbay.","org.xml.","org.w3c.", "org.apache.commons.logging.","org.eclipse.jetty.continuation.","org.eclipse.jetty.jndi.","org.eclipse.jetty.plus.jaas.","org.eclipse.jetty.websocket.WebSocket", "org.eclipse.jetty.websocket.WebSocketFactory", "org.eclipse.jetty.servlet.DefaultServlet"}

* ServerClasses (on the container classpath) 不能被webapp 上下文 classloaders看到但是可以被webapp覆写. 默认配置是: 

{"-org.eclipse.jetty.continuation.","-org.eclipse.jetty.jndi.", "-org.eclipse.jetty.plus.jaas.", "-org.eclipse.jetty.websocket.WebSocket","-org.eclipse.jetty.websocket.WebSocketFactory","-org.eclipse.jetty.servlet.DefaultServlet", "-org.eclipse.jetty.servlet.listener.", "org.eclipse.jetty."};

    [这段不知道如何翻译]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);

分享到:
评论

相关推荐

    jetty8.0.4

    轻量级web server,纯java, etc下可修改配置文件jetty.xml(端口等),使用java -jar start.jar启动

    jetty-8.0.4.v20111024:jetty-8.0.4.v20111024 ,支持弹性策略文件请求

    码头-8.0.4.v20111024 jetty-8.0.4.v20111024 ,支持弹性策略文件请求

    jetty相关的全部jar包

    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....

    eclipse jetty插件run-jetty-run-1.3.3

    eclipse jetty插件,从...下载run-jetty-run.zip文件,解压后再编写个links文件丢到eclipse的dropins目录下即可,省去了使用eclipse update方式安装的麻烦。 link文件样例如: path=d:\\eclipse_plugins\\run-jetty-run

    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 ...

    Jetty中文手册

    Jetty体系结构(Architecture) Jetty Classloading Jetty JARS和依赖(Dependencies) 启动参数(Start Options) Jetty and JEE6 Web Profile 配置参考 Jetty XML语法(Syntax)–Jetty IOC Configuration Jetty ...

    jetty嵌入式服务器必须的jar包

    jetty嵌入式服务器开发所必须的jar包,本人使用jetty版本为6.1.3,jar包总数为9个,来自jetty:commons-el-1.0.jar,jasper-compiler-5.5.15,jasper-compiler-jdt-5.5.15.jar,jasper-runtime-5.5.15.jar,jetty-...

    jetty6 指南书

    jetty是什么 jetty配置 jetty使用 jetty嵌入 jetty启动 jetty部署 jetty教程 jetty嵌入式 jetty

    jetty相关所有jar包

    jetty相关所有jar包,包含jar包: jetty-continuation-8.1.15.v20140411,jetty-http-8.1.15.v20140411,jetty-io-8.1.15.v20140411,jetty-security-8.1.15.v20140411,jetty-server-8.1.15.v20140411,jetty-util-8.1.15...

    maven集成jetty所需jar包maven-jetty-plugin,多版本

    maven集成jetty必须jar包maven-jetty-plugin,内含多个版本

    Jetty配置支持https

    Jetty配置支持HTTPS以及受信网站证书生成方式

    jetty-9.4.6

    jetty-9.4.6

    i-jetty libs包

    android i-jetty servlet-api-2.5.jar jetty-servlet-7.6.0.RC4.jar jetty-server-7.6.0.RC4.jar jetty-http-7.6.0.RC4.jar

    jetty 学习资料合集

    jetty 学习资料合集 jetty 学习资料合集 jetty 学习资料合集 jetty 学习资料合集

    Jetty cometd(Continuation)学习笔记

    Jetty 7是Jetty奔向Eclipse后发布的第一个版本,本次的Jetty 7 RC2带给了我们一个十分诱人的新特性-支持跨域名Ajax请求。众所周知因为安全的原因,多数浏览器都限制了Ajax跨域请求和javascript加载的时候只能是与...

    jetty 9.2.24

    jetty服务器,9.2版本适合java7+开发环境。 Jetty是一个纯粹的基于Java的网页服务器和Java Servlet容器。 尽管网页服务器通常用来为人们呈现文档,但是Jetty通常在较大的软件框架中用于计算机与计算机之间的通信。 ...

    Jetty嵌入项目代码中示例

    Jetty嵌入项目代码中示例,现我有一示例项目 e:/workspace/web-demo(称为project_home),里面的Web根目录是WebContent。 在project_home建一个jetty目录,子目录如:contexts、etc、lib。 把${jetty_home}/etc...

    jetty-io-9.4.43.v20210629-API文档-中英对照版.zip

    赠送jar包:jetty-io-9.4.43.v20210629.jar; 赠送原API文档:jetty-io-9.4.43.v20210629-javadoc.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。

    Jetty9 配置使用HTTPS证书

    Jetty9 配置使用HTTPS证书,访问你的服务器更安全,更好的配置方法。

    jetty-distribution-9.4.47.v20220610

    jetty9.4.47用于部署或替换jar升级jetty解决安全漏洞 下载镜像地址https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-distribution/9.4.47.v20220610/

Global site tag (gtag.js) - Google Analytics