2016年3月18日星期五

EAP_048:EAP 6 类加载机制(二)

环境:OS X EI Capitan 10.11.3 + JBoss EAP 6.4.0

1. 部署应用时的类加载机制

1.1 部署 .war
.war 文件被看成一个单独的 module,使用同一个类加载器加载 WEB-INF/lib 目录下的类和 WEB-INF/classes 目录下的类。

1.2 部署 .ear
.ear 由多个 module 组成,如下:
(1)根目录下的 lib/ 目录是一个单独的 module,称之为 parent module。
(2)其中的每一个 .war 是一个单独的 module。
(3)其中的每一个 EJB JAR 是一个单独的 module。

.ear 中的 .war 和 .jar 称之为 subdeployment,它们自动依赖 parent module。
但 .ear 中的 .war 和 .jar 彼此之间不会自动互相依赖,这个称之为 subdeployment isolation。
不过这个特性可以 disabled,可以为某个 .ear 设置,也可以设置在整个 EAP 上。
subdeployment 之间可以使用 explicit dependencies 定义依赖关系,就像 module 之间的依赖关系一样。

2. 类加载优先级
(1)首先加载 implicit dependencies
implicit dependencies 是 EAP 自动加载的,比如 Java EE 6 API。
(2)其次加载 explicit dependencies
explicit dependencies 可以定义在应用的 MANIFEST.MF 文件中,或者 jboss-deployment-structure.xml 文件中。
(3)接着加载应用本地的类
比如 WEB-INF/lib 目录下的类 和 WEB-INF/classes 目录下的类。
(4)最后加载 inter-deployment dependencies
这些是在 .ear 中定义的依赖,比如 依赖 .ear 中的 lib/,或者 .ear 中的 EJB jars。

3. 动态 module 的命名规则
(1).war 和 .jar 文件:deployment.DEPLOYMENT_NAME
比如 inventory.war 和 store.jar 的 module 名称是 deployment.inventory.war 和 deployment.store.jar。
(2).ear 中的 subdeployments:deployment.EAR_NAME.SUBDEPLOYMENT_NAME
比如 accounts.ear 中的 reports.war 的 module 名称是 deployment.accounts.ear.reports.war。

参考文献:
1. 《JBoss_Enterprise_Application_Platform-6.4-Development_Guide-en-US.pdf》第三章 Class Loading and Modules
2. http://www.mastertheboss.com/jboss-server/jboss-as-7/jboss-as-7-classloading?showall=
3. http://www.mastertheboss.com/jboss-server/jboss-as-7/jboss-as-7-classloading?start=1
4. http://www.mastertheboss.com/jboss-server/jboss-as-7/jboss-as-7-classloading?showall=&start=2
5. http://stackoverflow.com/questions/34293402/jboss-how-can-to-exclude-javax-validation-in-jboss-deployment-structure

没有评论: