论坛登陆 用户名:  密 码:
设为首页  加入收藏
08年北京名校秋季招生
名牌院校免试入学宽进严出,突破考分限制,名校与你零距离,以下院校按报名先后顺序录取,24小时网上报名覆盖全国
  您现在的位置: 中国教育招生在线 >> IT >> JAVA认证 >> IT正文
Apusic应用服务器的ClassLoader结构
 作者:佚名     2007-3-14 16:40:59        来源:不详  浏览次数:

 

 

 

 

 

 

 

 

Apusic应用服务器的ClassLoader体系结构

    J2EE1.3规范定义了一个打包机制的框架,用来把J2EE应用的各个部分组织在一起。不同的应用服务器厂商可以自由的设计自己的类装载层次来获得应用中的类和资源。因此开发者必须非常清楚类和资源应该放置在什么位置对于J2EE应用才是可用的。理解Apusic应用服务器的类装载体系结构能够帮助J2EE应用的开发者设计高效和可移植应用打包结构。本文先介绍类装载的基本概念,然后讨论了Apusic应用服务器的类装载层次是如何设计的。通过这篇文章,J2EE应用的开发者能够更好的理解Apusic应用服务器的类装载体系结构是怎样从J2EE应用中获得类和资源,对于排除一般的ClassNotFoundException异常有很大的帮助。
类装载的基本概念

    classloader一般被组织成父/子的层次结构。当一个类装载请求被提交到classloader时,它首先请求父classloader完成这个请求,而父classloader会依次逐级向上传递请求,直到类装载层次的顶部。如果顶部的classloader不能完成类装载请求,它的子classloader将被调用来完成类装载。如果子classloader也不能装载类,请求会继续向下传递,直到一个classloader完成这个请求,否则如果类装载层次底部的classloader都不能完成请求,就会抛出ClassNotFoundException异常。
                     classloader A
                          \                          
                         /|\
                          |
                     classloader B
                        \     \                     
                       /|\   /|\
                        |     |
            classloader c   classloader D

                   classloader 层次结构

 上图显示了一个基本的ClassLoader的层次结构。在给定层次上的ClassLoader不能引用任何层次低于它的ClassLoader,另外,对于它的子ClassLoader装载的类是不可见的。在上图中,如果类Foo是由ClassLoader B装载的,并且Foo依赖于类Bar,那么类Bar必须有ClassLoader A或B装载。如果类Bar只是对ClassLoader C和D可见,那么将会发生ClassNotFoundException异常。
??如果类Bar分别对于两个平级的ClassLoader可见(例如C和D),但对于它们的父ClassLoader不可见,那么当类装载请求发送到这两个ClassLoader时,每一个ClassLoader会装载自己版本的类。ClassLoader C装载的类Bar的实例将不兼容于D装载的类Bar的实例。如果对ClassLoader的层次结构不了解,上面的描述可能会引起类型不兼容的混乱。
??通过编程显示ClassLoader的层次结构非常简单,但结果却能够非常有效的帮助我们标识类是如何被装载的。例如下面的程序将显示装载类Foo的ClassLoader的层次。
public class Foo
{
    public void showCLHierarchy() {
        ClassLoader classLoader = getClass().getClassLoader();
        System.out.println("the classloader is : " + classLoader + "\r"); 
        
        classLoader = classLoader.getParent(); 
        System.out.println("the parent classloader is : " + classLoader);
    }
    public static void main(String[] args){
        Foo foo = new Foo();
        foo.showCLHierarchy();
    }
}
??注意确定当前路径在classpath中,编译并运行上面的程序。例如在windows平台下:
E:\classloader\test>javac Foo.java
E:\classloader\test>java Foo
??如果编译和运行环境为SUN公司的JDK1.3+,将看到下面的运行结果:
the classloader is : sun.misc.Launcher$AppClassLoader@e39a3e
the parent classloader is : sun.misc.Launcher$ExtClassLoader@a39137
Apusic应用服务器ClassLoader体系结构
??Apusic应用服务器采用了两层的ClassLoader层次结构。当Apusic服务器启动后,它会创建一系列父/子关系ClassLoader,如下图所示。下面会讨论每一种ClassLoader的特性,包括它们可见的类和资源。
                          bootstrap
                             /|\
                              |
                           system
                          /|\   /|\
                           |     |
              ear classloader    ear classloader
                      /|\          /|\
                       |            |
              war classloader    war classloader
                         
                     Apusic classloader 体系结构
                       
Bootstrap
 这个ClassLoader装载Java虚拟机提供的基本运行时刻类,还包括放置在系统扩展目录($JAVA_HOME/jre/lib/ext)内的JAR文件中的类。
System
??系统ClassLoader通常负责装载系统环境变量CLASSPATH中设置的类。由系统ClassLoader装载的类对于Apusic服务器内部的类和部署在Apusic服务器上的J2EE应用(通常打包成ear)都是可见的。%APUSIC_HOME%/lib目录下的jar文件是Apusic应用服务器的核心类,一般把这些jar文件都加在系统CLASSPATH中。
??另外,一些公用类也可以加在系统CLASSPATH中,如JDBC 驱动程序等。
Ear ClassLoader
??每个EAR有一个ClassLoader,用于装载EJB module和公共类。由于每个EAR的ClassLoader处于平级关系,所有不同应用中的类相互不可见。假设一个应用的目录结构如下:
      MyApp
        |
        |_MyEJB
        |   |_com
        |      |_apusic
        |          |_app
        |             |_HelloBean.class
        |    
        |_MyWEB
        |    |_WEB-INF
        |    |    |_classes
        |    |    |_lib
        |    |_index.jsp
        |    |_...
        |
        |_META-INF


   EAR ClassLoader负责装载的类路径为:MyApp/和MyApp/MyEJB/,也就是说在这两个目录下的类会被EAR ClassLoader装载,一般都是EJB moudle和公共类。
War ClassLoader
  每个WAR有一个ClassLoader,是EAR ClassLoader的子ClassLoader,用于装载Servlet和JSP等。WAR ClassLoader负责装载的类路径包括:
·    MyApp/MyWeb/WEB-INF/classes/ 目录下的类
·    MyApp/MyWeb/WEB-INF/jar/ 目录下的jar文件
·    %APUSIC_HOME%/scratch/hostname_port_MyApp/jsp/ 目录下的类,这些类是JSP页面对应的Servlet
??由于WAR ClassLoader为EAR ClassLoader的子 ClassLoader,因此由EAR ClassLoader装载的EJB module和公共类对于Web应用中的JSP和Servlet是可见的。
??理解了ClassLoader的原理和Apusic应用服务器ClassLoader的体系结构后,对于开发J2EE应用过程中遇到的ClassNotFoundException异常和类不兼容等问题的解决有很大的帮助。例如对于上面的应用MyApp,假设公共类com.apusic.app.util.Log用于记录日志,可以把这个类放在MyApp/MyEJB/com/apusic/app/util目录下,这样,这个类会由EAR ClassLoader装载,对于EJB和Web应用都是可见的。如果开发者把这个类的一个拷贝放在MyApp/MyWeb/WEB-INF/classes目录下,根据ClassLoader的代理模式,在Web应用中使用这个类时,Log类仍然会由EAR ClassLoader装载。因为发送给WAR ClassLoader的类装载请求会首先传递为父ClassLoader来执行,而EAR ClassLoader能够处理这个请求,所以会由它来装载Log类。如果开发者对服务器的这种行为没有很好的理解,可能会发生莫名其妙的错误:明明更改了MyApp/MyWeb/WEB-INF/classes目录下的Log类,但为什么在Web应用中还是执行旧的行为,即使重新启动了Apusic服务器也无济于事。原因很简单:Log类总是由EAR ClassLoader装载,放在MyApp/MyWeb/WEB-INF/classes目录下的Log类根本没有用!
??Apusic应用服务器利用这种方便而灵活的ClassLoader策略,支持J2EE应用的部署和运行。相信随着开发者对Apusic应用服务器的熟悉,会越来越喜欢在Apusic上开发J2EE应用!


责任编辑:lss
  相关新闻
Jsp中的Application使用
使用AppFuse框架进行开发的总结
生成Mapping文件、编辑HQL语言的好工具
Oracle9i iSQL*PLUS的配置过程
用Apache Velocity模板引擎速造网站(1)
Oracle发布免费数据库管理工具Raptor
简易使用Apache Web让你的JSP“动”起来
[FW:] Writing big files to ServletOutputStream
开发框架:浅谈Hibernate的flush机制
在Applet中应用JDBC访问数据库
Oracle发布免费数据库管理工具Raptor
Oracle9i iSQL*PLUS的配置过程
生成Mapping文件、编辑HQL语言的好工具
使用AppFuse框架进行开发的总结
用Apache Velocity模板引擎速造网站(1)
用Apache Velocity模板引擎速造网站(2)
在Applet中应用JDBC访问数据库
重温Struts--ActionMapping和ActionForward
利用java Api打印JTable
Applet与Servlet通讯的四种方法及其比较
  评论
现在有100人对本文发表评论
查看所有评论
 
推  荐
 
100本成功必读热销书
热门招生
  北京文理研修学院   前进大学
  北京明园大学   北京建设大学
  北京邮电大学世纪学院   北方工商管理学院
  联想软件定向委培班   香港数码动画学院
  青年企业管理研修学院   北京华夏管理学院
热门培训
网络化办公专家培训认证 电子科技大学软件学院
软件测试工程师培训认证 北大青鸟十大授权培训
IT硬件工程师培训认证班 北京环球雅思荷兰预科
JAVA开发工程师培训 潜能时代IT服务管理培训
网络信息化工程师培训 清华大学继续教育学院
论坛精选
 
有些细节是男人也该注意的风度!最容易读错的字
某强人手机里保存的30条短信 中国十大高薪职业
最感人的十大韩剧经典台词 嫁给工程师的N个理由
爆强!只有一句话的鬼故事 转贴教你如何做妖精
 女人一定要記住的話 女人最好别嫁给最爱的男人
城市联盟
 大连 上海 天津 广州 西安 深圳  天津  青岛  大连  福州  沈阳  青海  连云港  南京  吉林  厦门  威海  辽宁  呼和浩特
Copyright © 2006   www.edu999.com   All rights reserved. 中国教育招生在线  版权所有
北京市通信管理局[2004]字第552号函    京ICP证040442号