2016年3月17日星期四

EAP_047:EAP 6 类加载机制(一)

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

在实际使用中,经常会遇到如下问题:
(1)开发者想使用一个新版本的类库,但 EAP 已经提供了一个旧版本的类库,如何在应用中使用指定版本的类库?
(2)如何在不同的应用中,使用不同版本的类库?

1. EAP 6 加载方式
JBoss EAP 6 使用 module class loading 方式加载类,开发者可以细粒度地控制应用需要加载的类,比如忽略 EAP 提供的类库,而使用自己的类库。
module 分两种:静态 module 与 动态 module。
静态 module 与 动态 module 只有打包方式的不同,加载方式是一样的。
module 只有在需要的时候才被加载。

1.1 静态 module
在 EAP_HOME/modules 目录下的都是静态 module,以 system/layers/base 目录开头,该目录下都是红帽提供的类库,主要是为了区分第三方的类库。
如果要加载第三方类库,请直接 EAP_HOME/modules 目录下创建在第三方类路径,不要在 system/layers/base 目录下创建。
这样的话,即使第三方类库已经在 system/layers/base 目录中有了,也会先加载第三方类库。

1.2 动态 module
指的是部署在 EAP 上的各种打包应用,比如 .jar、.war、.ear。
动态 module 由 EAP 运行时加载,module 可以配置 dependencies。

2. dependencies
dependencies 有两种: explicit dependencies 和 implicit dependencies。

2.1 explicit dependencies
静态 module 是定义在 modules.xml 文件中的,动态 module 是定义在 MANIFEST.MF 文件或 jboss-deployment-structure.xml 文件中的。
explicit dependencies 可以设置成 optional,如果该 dependency 加载失败,不影响整个 module 的加载。
但有一点要注意,如果加载 module 时,optional dependencies 加载失败,那么即使以后该 optional dependencies 可以加载了,也不会加载了。

2.2 implicit dependencies
implicit dependencies 是 EAP 自动加载的,比如 Java EE 6 API 就是 implicit dependencies。
部署时,通过在 jboss-deployment-structure.xml 文件中定义,可以配置 exclude 指定的 implicit dependencies。
比如应用不想使用某个 implicit dependency,而想使用自己的类库。

2.3 export=“true”
module A 依赖 module B,module B 依赖 module C。
module A 可以访问 module B 的类,module B 可以访问 module C 的类,但是 module A 不可以访问 module C 的类。
要想 module A 可以访问 module C 的类,其依赖的module B 中必须增加 export="true"。
<dependencies>
  <module name="moduleB" slot="1.1" export="true"/>
</dependencies>

参考文献:
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

没有评论: