选择显示字体大小

深入了解weblogic的类装载机制详解

如果大家对一般类的装载器熟悉的话,就知道在java中类的装载采用“代理机制”,即子装载器如果需要装载一个类文件,首先会将此任务提交给父装载器,如果父装载器找不到此类文件,才有子装载器来装载类文件,如果子装载器也找不到,那么就会报告classnotfoundexception异常。

1.weblogic允许定制的类装载器,同时也有一个默认的类装载器。其默认的装载器的结构分层如下:

 


当部署一个应用的时候,weblogic server会自动创建一个具有层次结构的类装载器。在图中,a.application classloader负责装载应用中的所有的ejb jar文件;

b.web application classloader负责装载所有的web application 中的war 文件(所有得jsp文件除外);

c.jsp classloader 负责装载web application 中的所有的jsp 文件;

这样的分层结构有一个好处,就是在jspservlet中可以直接访问ejb的接口。这种上层装载ejb,下层装载servlet等,最下面装载jsp文件的结构,使得经常变动的jspservlet等可以被重新装载而不会涉及到ejb层。

在这种默认的类装载器结构下,有一点需要提出的是:

a. 我们的应用必须打包成一个ear文件,才会允许我们应用中的jspservlet文件直接访问ejb;如果将war与jar文件分别打包。weblogic server会为他们分别生成一个类装载器,作为兄弟节点,这时如果需要在jsp或者servlet中使用ejb,就必须将ejb的home接口与remote接口打包到war中才可以。后面这种情况,适合用在将ejb的客户端和ejb部署在不同的jvm中;

b.web application classloader中,不会装载jsp文件,jsp文件由web application classloader的子装载器jsp classloader负责装载,因为jsp文件经常的变动,通过为jsp设立一个单独的classloader可以避免对jsp的装载影响到其他的java class或者ejb

默认装载器的优点:

a. 调用ejb的时候可以采用call-by-referrence的方式;

b. 允许web module独立的装载,不影响其它的web module;

通过在将整个应用打包成一个ear文件,可以方便的不用再web module中包含ejb的home和remote接口,就可以方便的通过call-by-referrence来调用ejb;

2. 定制classloader

如果觉得默认的类装载器不能满足需要,weblogic server支持定制的类装载器。在weblogic的文档中指出,自定义的classloader多用于开发者使用,当应用发布之后,不推荐使用。自定义的类装载器通过xml文件来描述。描述文件放在weblogic-application.xml中。weblogic官方提供的dtd描述文件如下:

<classloader-structure>

<module-ref>

<module-uri>ejba.jar</module-uri>

</module-ref>

<module-ref>

<module-uri>webc.war</module-uri>

</module-ref>

<classloader-structure>

<module-ref>

<module-uri>weba.war</module-uri>

</module-ref>

</classloader-structure>

<classloader-structure>

<module-ref>

<module-uri>ejbc.jar</module-uri>

</module-ref>

<module-ref>

<module-uri>webb.war</module-uri>

</module-ref>

<classloader-structure>

<module-ref>

<module-uri>webd.war</module-uri>

</module-ref>

</classloader-structure>

<classloader-structure>

<module-ref>

<module-uri>ejbb.jar</module-uri>

</module-ref>

</classloader-structure>

</classloader-structure>

</classloader-structure>

通过我们给出的配置文件,我们自定义的classloader的层次结构如下图:

 


j2ee的规范中明确的指出,j2ee应用不应该依赖于任一个给定的类装载器。所以,我们自定义的类装载器,在开发过程中还是可以使用的,但一定不要应用于发布后的应用中。

自定义的类装载器有如下得限制:

a.不能够装载servlet;

b.嵌套的深度最大为3,也就是说,最多只能够嵌套三层;

c.自定义装载器的module类型仅限于 webejb这两种;

d.jsp classloader不受此自定义类装载器的影响,它永远都是web module的子类装载器;

相同的类可能导致部署异常;

在自定义的类装载器中,如果要使用ejb,就必须将ejb的home和remote接口打包到相应的web module中去;

3.ejb的单独加载

有时候我们可能需要单独加载某个ejb,这个时候我们可以通过以下两种方法来实现:

第一:将应用需要的jar文件放在app-inf/lib中,或者将类文件放在app-inf/classes中,这些类文件和jar文件会被root classloader进行装载,可以被多个应用共享;

第二:可以通过meta-inf/manifest.mf文件来指定需要的classes。通常的用法是在meta-inf/manifest.mf文件中增加class-path:一行。举例如下:

class-path:/d:ejb/add.jar

这样就会在当前的jar包中可以找到我们需要的add.jar文件。需要说明的是,在class-path:行的最后一定要有一个换行,否则会发生错误。还有,通过class-path只能指定本地的jar文件。

如果能对应用服务器的类装载原理有了较清楚地了解,会对我们的应用移植,在开发中避免不必要的类装载的错误会有很大的帮助。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons