WebLogic ClassLoader
Weblogic中发布的一个应用一般目录结构如下
对应的各层级结构如下
Application ClassLoader用来加载EJB JARS、APP-INF/lib、APP-INF/classes、EJB JARS中ClassPath变量定制的路径下的类
Web Application ClassLoader用来加载WAR、WAR中ClassPath变量定制的路径下的类。
Weblogic下的ClassLoader用的也是委托模型。首先BootStrap先进行寻找,找不到再由ExtClassLoader寻找,然后在由AppClassLoader一级一级往下找。这样的分层结构有个好处,就是在Jsp,Servlet中可以直接访问EJB的接口。这种上层装载EJB,下层装载Servlet,最下层加载jsp文件的结构,使得经常变动的jsp,Servlet等可以被重新装载而不会被涉及到EJB层。
Weblogic可以通过修改配置文件weblogic.xml中的prefer-web-inf-classes元素,来修改这种加载顺序。默认情况下,该元素设置为 False。将该元素设置为 True 会颠反类加载器委托模型,以便优先加载 Web 应用程序中的类定义,其次才加载更高一级的类加载器中的类定义。这使得 Web 应用程序能够使用自己版本的第三方类,这些类也可能包含于 WebLogic Server 中。请参阅 weblogic.xml 部署描述符元素。
WebLogic Server 类加载以应用程序的概念为核心。应用程序通常打包为企业归档 (EAR) 文件,其中包含应用程序类。EAR 文件中的所有内容均被视为同一个应用程序的组成部分。
下面的内容可以作为EAR 的一部分,也可以作为独立应用程序进行加载:
Enterprise JavaBean (EJB) JAR 文件
Web 应用程序 WAR 文件
资源适配器 RAR 文件
如果分别部署EJB和Web应用程序,会将它们视为两个应用程序。如果将它们一起部署在EAR文件中,则它们是一个应用程序。可以将模块共同部署于一个EAR文件内,以便系统将它们视为同一个应用程序的各部分。
每个应用程序都接收其自己的类加载器层次结构;该层次结构的父级是系统类路径类加载器。这可以隔离应用程序,以使应用程序A无法查看应用程序B的类加载器或类。在层次结构类加载器中,不存在同级或同伴的概念。应用程序代码只能看到与该应用程序(或模块)关联的类加载器所加载的类,以及应用程序(或模块)类加载器的父类加载器所加载的类。这允许 WebLogic Server在同一个JVM中承载多个隔离的应用程序。
应用程序类加载器层次结构
部署应用程序时,WebLogic Server自动创建类加载器的层次结构。该层次结构的根类加载器将加载应用程序中的所有EJB、JAR 文件。将针对每个Web应用程序WAR文件创建子类加载器。
由于 Web 应用程序通常会调用 EJB,所以 WebLogic Server 应用程序类加载器体系结构允许 JavaServer Page (JSP) 文件和 servlet 查看其父类加载器中的 EJB 接口。这种体系结构还允许在不重新部署 EJB 层的情况下重新部署 Web 应用程序。实际上,通常会更改 JSP 文件和 servlet,而不更改 EJB 层。
下图说明此 WebLogic Server 应用程序类加载的概念。
如果您的应用程序包含使用 EJB 的 servlet 和 JSP:
将 servlet 和 JSP打包在 WAR 文件中
将 Enterprise JavaBean打包在 EJB JAR 文件中
将 WAR 和 JAR 文件打包在 EAR 文件中
部署 EAR 文件
尽管可以分别部署 WAR 和 JAR 文件,但如果将它们共同部署于 EAR 文件内,则会生成允许 servlet 和 JSP 查找 EJB 类的类加载器安排。如果分别部署 WAR 和 JAR 文件,WebLogic Server 将为它们创建同级类加载器。这表明您必须在 WAR 文件中包含 EJB Home 接口和远程接口,且 WebLogic Server 必须针对 EJB 调用使用 RMI 存根和骨架类,如同 EJB 客户端和实现类位于不同 JVM 中一样。
参考至:《叱咤风云:WebLogic企业级运维实战》戴冠平著
http://hi.baidu.com/love200456/blog/item/9d4d70fbdc38c970024f564f.html
如有错误,欢迎指正
邮箱:czmcj@163.com