`
yuping322
  • 浏览: 94321 次
  • 来自: ...
社区版块
存档分类
最新评论

Understanding J2EE Application Server Class Loading Architectures

阅读更多

Understanding J2EE Application Server Class Loading Architectures<o:p></o:p>

前言<o:p></o:p>

打包(J2EE1.3的说明中第八章)让框架可以把一个J2EE应用的方方面面聚合到一起,但是,应用服务器提供商们可以自由地设计合适的类装载层次,来获得应用中的类和资源。典型的类装载层次应用比如:热部署和应用独立。<o:p></o:p>

理解主流应用服务器类装载的架构帮助J2EE开发人员设计出轻便和高效的应用的包结构。在简要地描述一下类装载的基本知识之后,介绍一下三个主流的应用服务器(BEA WebLogic 6.1 SP2, IBM WebSphere 4.0, and HP-AS 8 Maintenance Pack 3)的类装载层次。讨论的范围限于J2EE application modules (.ear), EJB modules (.jar) and web application modules (.war).本文假设读者有J2EE packaging mechanisms (.ear, .war, and .jar)的知识,否则请参照说明文档。<o:p></o:p>

读完这篇文章之后,J2EE开发人员将会对类装载架构如何影响J2EE的包的结构有更好的理解。附加的,类装载架构的知识在调试J2EE服务器抛出的ClassNotFoundException的时候有非常大的好处。<o:p></o:p>

<o:p> </o:p>

类装载基本<o:p></o:p>

典型的类装载器是一个亲子结构。如果一个类加载的请求发送给了一个类加载器,他首先让他的父类加载器来完成这次请求,他的父类加载器也会轮流的要求他自己的父类来完成这次请求,直到类加载器层次的最高点。如果层次最高点的类加载器不能完成这次请求,被请求的这个类加载器会自己加载被请求的类。如果无法完成,那么请求将会发送给层次的下层类加载器,直到加载完成或者ClassNotFoundException被抛出。

<o:p></o:p>

<v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype><v:shape id="_x0000_i1026" style="WIDTH: 4in; HEIGHT: 263.25pt" type="#_x0000_t75"><v:imagedata src="file:///C:\DOCUME~1\Yaogao\LOCALS~1\Temp\msohtml1\02\clip_image001.gif" o:title="1"></v:imagedata></v:shape><o:p></o:p>

1描述了几个基本的类加载层次。注意到在一个确定层次被加载的类可能不会引用任何被低层次的类加载器加载的类。另外一个角度,类加载器不能看到他子孙类加载器加载的类。在图1中,如果类Foo被类加载器B加载,而且Foo依赖类Baz,这样的话,Baz必须被类加载器A或者B加载。如果Baz紧紧只能被C或者D看到,那么就会抛出ClassNotFoundException<o:p></o:p>

如果类Bar可以被两个同级的类加载器看到(图中的CD),但是他们的父类加载器看不到,而起加载Bar的请求被同时发送给CD,那么这个时候CD都会加载自己的版本,被C加载的类和被D加载的类是不兼容的(也就是不是同一个类),这个基本的事实会导致一些难以理解的Bug,尤其是类加载层次不好理解的时候。<o:p></o:p>

J2EE1.3的说明8.1.1.2节要求显式地支持通过Extension Mechanism Architecture支持独立的jar文件的绑定。应用服务器必须加载被列举在主jar文件的Manifest Class-Path的独立的jar文件(特别是EJBjar文件)。但是这个要求earwar文件支持。扩展机制是一个我们在打包一个应用的时候不可忽略的非常有价值的技术。任何时候如果可以,一定要调查和弄懂哪个类加载器会加载这些独立的jar文件。<o:p></o:p>

通过编程来发现类加载器层次非常简单,但是输出结果可以帮我确定类是如何被加载的。下面的代码会从一个给定的Class的角度展示出类加载层次。<o:p></o:p>

ClassLoader classLoader = getClass().getClassLoader();<o:p></o:p>

      // Implies that we're at the top of the hierarchy when null.<o:p></o:p>

      while (classLoader != null) {<o:p></o:p>

         System.out.println("Class/Method Name Here: parent classLoader == " +<o:p></o:p>

                            classLoader.toString());<o:p></o:p>

         // Note that getParent() may require opening up the<o:p></o:p>

         // security settings in the JVM.<o:p></o:p>

         classLoader = classLoader.getParent();<o:p></o:p>

      }<o:p></o:p>

      System.out.println("Class/Method Name Here: parent classLoader == null");<o:p></o:p>

J2EE应用服务器一般都会应用至少两层的类加载器。如果没有准确地理解在一个应用服务器中类是如何加载的,有可能会导致困难的bug和令人迷惑的运行时错误。在这个基础上,让我们看看三个主流的应用服务器是如何选择实现他们的类加载器的。<o:p></o:p>

WebLogic 6.1 with Service Pack 2<o:p></o:p>

当我们在WebLogic 6.1 SP2上边部署我们的J2EE应用的时候,在标准的系统类加载器下,两个或者更多的新的类加载器会被创建,图2展示了这个类加载器架构。一个EJB类加载器作为系统的类加载器的子类被创建。他负责加载所有的在这个ear文件中的EJBjar文件。一个Web应用类加载器(web application class loaders)EJB类加载器的子类,他负责加载war包中的类和在WEB-INF/classes 以及WEB-INF/lib下的jar文件和类。(注意: WebLogic 6.1的说明文档中说只有一个类加载器来加载所有的war文件是不准确的)

<o:p></o:p>

<v:shape id="_x0000_i1027" style="WIDTH: 357.75pt; HEIGHT: 282.75pt" type="#_x0000_t75"><v:imagedata src="file:///C:\DOCUME~1\Yaogao\LOCALS~1\Temp\msohtml1\02\clip_image002.gif" o:title="2"></v:imagedata></v:shape><o:p></o:p>

WebLogic 6.1 SP2中,在Manifest Class-Path被列举的所有的jar文件会被EJB类加载器加载。包括在earEJBjar文件和war文件的Manifest Class-Path。但是注意,这个仅仅支持Manifest Class-Path在同一个ear文件中。<o:p></o:p>

这个类加载架构的一个优势是web应用的类加载器可以看到所有的EJB类。但是,被web应用的类加载器加载的类(war文件中WEB-INF/classes 或者WEB-INF/lib下的类)不能被EJB看到。<o:p></o:p>

如果war或者jar文件被独立(不在同一个ear文件中)地部署到WebLogic 6.1 SP2,他们会被看作是分开的应用,而且彼此会有不同的类加载器。这就是说独立的war不再能够默认地访问EJB类。<o:p></o:p>

<o:p> </o:p>

WebSphere 4.0<o:p></o:p>

WebSphere 4.0的类加载架构比WebLogic 6.1相对负责,WebSphere的说明文档解释了为什么根据classpath而不是类加载器。<o:p></o:p>

WebSphere 4.0定义了一个分离模式(isolation mode),这个特殊的分离模式(isolation mode)改变了一个类加载器必须关联其他的类加载器。在WebSphere 4.0中有四个isolation modes<o:p></o:p>

Module(模块):一个类加载器被创建给一个ear的每个模块。一个模块指的是一个warEJB jar或者被列举在war或者jarManifest Class-Path中的jar文件。逻辑的类加载器层次由各个独立的模块来决定。比如:一个应用有两个war文件,两个EJB jar文件和两个普通的jar文件(Manifest Class-Path),那么就会创建六个类加载器。<o:p></o:p>

Application:这个模式允许在同一个应用里所有的类加载器互相访问,就像整个应用只有一个类加载器。<o:p></o:p>

Compatibility:这个模式是为了向后兼容WebSphere 3.5.x 3.0.2.x的类加载语义。这个模式和WebLogic 6.1中,所有的war模块可以看到EJB模块一样,而且所有的EJB模块可以互相看到。<o:p></o:p>

Server:这个模式逻辑地让整个server看起来只有一个类加载器。<o:p></o:p>

3展示了Module mode.的类加载层次架构。注意到所有模块的类加载器都在一个层次上。但是,在WebSphere 4.0中,这并不能说明这些类加载器互相完全不知道,类加载器组(class loader grouping mechanism)可以保证合适的类加载层次的语义。比如:在EJB1Manifest Class-Path

评论

相关推荐

    正交频分复用 (OFDM) 基础收发机Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    通信工程勘察设计安全操作规程.docx

    通信工程勘察设计安全操作规程.docx

    【数据库技术】SQL入门与实战指南:从基础语法到应用场景的全面解析

    内容概要:本文是一篇面向初学者和技术爱好者的《SQL 入门与实战》指南,系统介绍了 SQL 的基本概念、功能及其应用场景。文章首先解释了 SQL 是一种用于操作关系型数据库的语言,能够执行数据的存储、查询、更新、删除以及表结构管理等操作。接着详细列举了基础语法,包括 SELECT、INSERT、UPDATE 和 DELETE 等语句的具体用法,并对常用的函数进行了分类说明,如聚合函数、字符串函数、时间函数等。此外,还深入探讨了多表连接、分组与聚合、子查询和窗口函数等进阶语法技巧。为了帮助读者更好地掌握 SQL,文中提供了从初级到高级的学习路线,并通过实际案例展示了 SQL 在后端 API 查询、数据报表分析、数据清洗与迁移等场景中的应用。最后简要比较了几种常见的数据库系统特性,强调了 SQL 在数据处理领域的重要性。 适合人群:适合初学者、实用派和技术爱好者,尤其是那些希望快速上手 SQL 并应用于实际工作的人员,如前端、后端、测试工程师、数据分析师和产品经理等。 使用场景及目标:①作为 SQL 学习入门资料,帮助读者理解 SQL 的基本概念和语法;②指导读者进行 SQL 编程实践,掌握数据查询、更新、插入、删除及表结构管理等操作;③为有经验的开发者提供进阶技巧,如多表连接、子查询、窗口函数等;④为从事数据相关工作的人员提供实用工具,提高工作效率。 其他说明:文章不仅涵盖了 SQL 的基础知识,还涉及到了一些高级主题,如事务、索引、视图、触发器等,并给出了进一步学习的书籍和在线资源推荐,鼓励读者通过持续学习来深化对 SQL 的理解和应用。

    wps办公日常使用11111111

    wps办公日常使用11111111

    卡通小熊素材PPT模板.pptx

    卡通小熊素材PPT模板

    汽车电子:MATLAB_实现CAN总线通信协议分析与故障诊断.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 你是否渴望高效解决复杂的数学计算、数据分析难题?MATLAB 就是你的得力助手!作为一款强大的技术计算软件,MATLAB 集数值分析、矩阵运算、信号处理等多功能于一身,广泛应用于工程、科学研究等众多领域。 其简洁直观的编程环境,让代码编写如同行云流水。丰富的函数库和工具箱,为你节省大量时间和精力。无论是新手入门,还是资深专家,都能借助 MATLAB 挖掘数据背后的价值,创新科技成果。别再犹豫,拥抱 MATLAB,开启你的科技探索之旅!

    支付技术基于MCP协议的支付宝AI支付工具集成:支付管理与应用场景详解

    内容概要:本文介绍了国内首个支付MCP(Model Context Protocol)框架,它定义了AI模型如何调用外部支付工具、获取支付数据并与支付服务交互。支付宝与魔搭社区合作,基于支付MCP Server框架为AI智能体提供无缝支付能力。支付MCP Server具有以下特点:支持MCP协议,简化支付接入流程;多端支持,涵盖移动端和网页端支付场景;全流程支付管理,包括支付、查询、退款等功能;灵活配置选项,满足不同开发需求。文中详细描述了支付MCP Server的功能,如创建支付、查询支付状态、发起退款和查询退款信息等,并提供了具体的配置方法和应用场景案例,如AI助手帮助用户在线购物、AI客服处理退款请求等。 适合人群:具有一定编程基础和技术背景的研发人员,尤其是对AI与支付集成感兴趣的开发者。 使用场景及目标:① 开发人员可以通过支付MCP Server快速实现支付功能,简化开发流程;② 提供全流程支付管理,增强应用的支付处理能力;③ 支持多端支付场景,提升用户体验;④ 通过灵活配置,满足不同业务需求,创造更多商业机会。 阅读建议:此资源详细介绍了支付M

    环境工程:MATLAB_实现大气污染扩散模型与可视化分析.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 你是否渴望高效解决复杂的数学计算、数据分析难题?MATLAB 就是你的得力助手!作为一款强大的技术计算软件,MATLAB 集数值分析、矩阵运算、信号处理等多功能于一身,广泛应用于工程、科学研究等众多领域。 其简洁直观的编程环境,让代码编写如同行云流水。丰富的函数库和工具箱,为你节省大量时间和精力。无论是新手入门,还是资深专家,都能借助 MATLAB 挖掘数据背后的价值,创新科技成果。别再犹豫,拥抱 MATLAB,开启你的科技探索之旅!

    【充电桩通信技术】基于云快充最新版协议的充电桩与新能源管理系统交互流程及数据格式定义:涵盖通信接口、帧类型、实时数据与运营交互等详细规范标题严格按照您的要求

    内容概要:本文档详细介绍了云快充最新版本的充电桩通讯协议,涵盖了从总则、通信协议结构、应用层报文帧格式、帧类型定义、通信协议流程、注册心跳帧类型码、实时数据帧类型码、运营交互帧类型码、运营平台设置帧类型码、车位锁通信协议、电桩远程维护帧类型码、并充模式帧类型码到附录的完整内容。重点描述了充电桩与新能源管理信息系统之间的数据交互流程、格式和内容,明确了通信接口采用TCP/IP Socket方式,支持有线网络接口和无线GPRS连接。文档还具体阐述了帧结构、数据格式定义、名词解释、各种帧类型的数据定义及流程,如上电流程、APP充电流程、刷卡充电、离线充电模式等,并提供了CRC16校验计算方法。 适合人群:从事充电桩开发、运维的技术人员,以及负责充电桩与平台对接的工程师。 使用场景及目标:①指导技术人员完成充电桩与新能源管理信息系统的对接,确保数据交互的正确性和稳定性;②帮助工程师理解并实现充电桩的各种功能,如登录认证、心跳包、实时数据传输、远程控制等;③为充电桩的日常维护和远程更新提供技术支持。 其他说明:本协议适用于交直流充电桩,交流部分数据无需上送。协议基于国网104充电桩规约,并参考GBT-27930标准。测试服务器地址为121.199.192.223,端口号为8768。文档还提供了详细的帧类型码定义和CRC16校验计算方法,确保数据传输的准确性。

    监理网站推广方案.docx

    监理网站推广方案.docx

    HI3519DV500 配置无线网依赖库以及编译脚本

    HI3519DV500 配置无线网依赖库以及编译脚本

    Clion和MinGW

    Clion和MinGW

    hardware-MLK-F6-7020.rar

    hardware_MLK-F6-7020.rar

    如何查看死锁.md

    如何查看死锁

    定制小米8-lineage22.1安卓15-fast功能项目线刷双版root 解锁bl后fast线刷

    资源说明; 1-----刷写前提是手机必须解锁bl先。而且会在fast模式刷写固件 2-----刷写方法与官方刷写步骤一样 3-----此固件为定制初始固件。可以在fast模式刷写 4-----属于适配固件。也许有个别bug。不接受请勿下载 5-----需要一定的刷机常识与动手能力的友友刷写。 6-----资源有可复制性。下载后不支持退。请知悉 7-----定制其他需求可以在csdn私信博主 博文参阅:https://csdn9.blog.csdn.net/article/details/143058308

    敏感图片敏感图片敏感图片敏感图片敏感图片敏感图片11

    敏感图片敏感图片敏感图片敏感图片敏感图片敏感图片11敏感图片敏感图片敏感图片敏感图片敏感图片敏感图片1122

    UniApp中使用renderjs进行AI对话实现流式请求及流式响应方式

    通过UniApp+vueJs+renderJs的前端框架实现一个AI对话的小功能,AI回答使用流式请求,响应流式输出的小案例。解决兼容低版本的手机端运行不支持流式Fetch的请求方式;

    铁路接触网检测:MATLAB无人机影像绝缘子定位.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 你是否渴望高效解决复杂的数学计算、数据分析难题?MATLAB 就是你的得力助手!作为一款强大的技术计算软件,MATLAB 集数值分析、矩阵运算、信号处理等多功能于一身,广泛应用于工程、科学研究等众多领域。 其简洁直观的编程环境,让代码编写如同行云流水。丰富的函数库和工具箱,为你节省大量时间和精力。无论是新手入门,还是资深专家,都能借助 MATLAB 挖掘数据背后的价值,创新科技成果。别再犹豫,拥抱 MATLAB,开启你的科技探索之旅!

    智慧矿山:MATLABDEM+SPH耦合算法在矿石破碎过程仿真中的应用.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 你是否渴望高效解决复杂的数学计算、数据分析难题?MATLAB 就是你的得力助手!作为一款强大的技术计算软件,MATLAB 集数值分析、矩阵运算、信号处理等多功能于一身,广泛应用于工程、科学研究等众多领域。 其简洁直观的编程环境,让代码编写如同行云流水。丰富的函数库和工具箱,为你节省大量时间和精力。无论是新手入门,还是资深专家,都能借助 MATLAB 挖掘数据背后的价值,创新科技成果。别再犹豫,拥抱 MATLAB,开启你的科技探索之旅!

Global site tag (gtag.js) - Google Analytics