http://publish.it168.com/2005/1109/20051109056401.shtml
作者:chinaitlab
【IT168 编程开发】如果大家对一般类的装载器熟悉的话,就知道在java中类的装载采用“代理机制”,即子装载器如果需要装载一个类文件,首先会将此任务提交给父装载器,如果父装载器找不到此类文件,才有子装载器来装载类文件,如果子装载器也找不到,那么就会报告ClassNotFoundException异常。下面简单谈一下我对weblogic server的类装载器原理的了解,希望能和大家分享。
1.Weblogic允许定制的类装载器,同时也有一个默认的类装载器。其默认的装载器的结构分层如下:
Application ClassLoader 装载所有的EJB
| |
| |
Web Application 1 ClassLoader Web Application 2 ClassLoader
| |
| |
JSP 1 ClassLoader JSP 2 ClassLoader
当部署一个应用的时候,weblogic server会自动创建一个具有层次结构的类装载器。在图中,a.Application Classloader负责装载应用中的所有的EJB JAR文件;
b.Web Application Classloader负责装载所有的Web application 中的WAR 文件(所有得jsp文件除外);
c.Jsp Classloader 负责装载Web application 中的所有的jsp 文件;
这样的分层结构有一个好处,就是在Jsp,Servlet中可以直接访问EJB的接口。这种上层装载EJB,下层装载servlet等,最下面装载jsp文件的结构,使得经常变动的jsp,servlet等可以被重新装载而不会涉及到EJB层。
在这种默认的类装载器结构下,有一点需要提出的是:
a. 我们的应用必须打包成一个EAR文件,才会允许我们应用中的jsp和servlet文件直接访问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类型仅限于 Web和 EJB这两种;
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文件。
如果能对应用服务器的类装载原理有了较清楚地了解,会对我们的应用移植,在开发中避免不必要的类装载的错误会有很大的帮助。
分享到:
相关推荐
4. **类装载分析**:查看类装载和卸载的情况,找出可能的内存占用问题。 5. **数据库连接分析**:监控数据库查询性能,优化SQL语句。 6. **应用服务器集成**:与各种应用服务器(如Tomcat、WebLogic等)无缝集成,...
3.2.2 类装载器ClassLoader 3.2.3 Java反射机制 3.3 资源访问利器 3.3.1 资源抽象接口 3.3.2 资源加载 3.4 BeanFactory和ApplicationContext 3.4.1 BeanFactory介绍 3.4.2 ApplicationContext介绍 3.4.3 父子容器 ...
3.2.2 类装载器ClassLoader 3.2.3 Java反射机制 3.3 资源访问利器 3.3.1 资源抽象接口 3.3.2 资源加载 3.4 BeanFactory和ApplicationContext 3.4.1 BeanFactory介绍 3.4.2 ApplicationContext介绍 3.4.3 父子容器 ...
- **Stubs 和 Skeletons**:自动生成的类,用于实现远程调用机制。 ##### 3. Weblogic 中的 EJB 实现 - **Weblogic 服务器**:提供了一个高性能的企业级 Java 应用服务器。 - **Stubs 和 Skeletons 的生成**:...
### WebSphere 安装全教程 #### 一、概述 WebSphere Application Server (WAS) 是 IBM 提供的一款...这对于初学者来说是一个非常实用且详尽的教程,能够帮助他们快速上手并深入理解 WebSphere 的核心概念和技术细节。
2.3.4. 对AspectJ装载时织入(AspectJ load-time weaving)的支持 2.4. 中间层 2.4.1. 在XML里更为简单的声明性事务配置 2.4.2. 对Websphere 事务管理的完整支持 2.4.3. JPA 2.4.4. 异步的JMS 2.4.5. JDBC ...
2.3.4. 对AspectJ装载时织入(AspectJ load-time weaving)的支持 2.4. 中间层 2.4.1. 在XML里更为简单的声明性事务配置 2.4.2. 对Websphere 事务管理的完整支持 2.4.3. JPA 2.4.4. 异步的JMS 2.4.5. JDBC ...