最近在深入学习jboss as7相关知识,as7的模块化和类加载是其中比较重要的知识点,现总结如下:
注:此部分知识官方英文介绍地址是:https://docs.jboss.org/author/display/MODULES/Module+descriptors
1.所有的类逻辑上被分组,每组叫一个模块
2.每个被部署的jar或者war被当作一个模块处理
3.某个模块可能包含一个jar或者多个jar以及其它资源,通常代表一个功能集合
4.如果模块A依赖模块B,则模块A加载的时候会把模块B的类也添加到自己的类路径上
5.模块分为动态模块和静态模块,它们之间的区别在打包上面,其它方面完全一样
1)静态模块
位于modules下的模块都是静态模块,每个子目录代表一个模块,每个模块中包含一个或者多个JAR文件以及一个module.xml文件;模块的名字定义在module.xml文件中 ;jboss应用服务器提供的API都是静态模块提供的,比如:JAVA EE apis以及jboss 日志api
当多个应用都依赖于同一个第三方类库的时候,用静态依赖的方式将会比较好,避免多次加载
2)动态模块
被部署到应用服务器的jar WAR或者EAR都是动态模块,动态模块的名字就是归档包的名字前加一个deployment(如:deployment.inventory.war),因为每个被部署的jar 或者war都是一个模块,所以它可以依赖于别的模块也可以被别的模块所依赖
6.模块依赖
模块依赖分为显示依赖(explicit)和隐式依赖(implicit)
显示依赖通过配置文件指定,比如静态模块中modules.xml文件中定义的依赖;
动态模块(用户自己的应用)中通过MANIFEST.MF(META-INF下面)和jboss-deployment-strucure.xml(位于WEB-INF下面)文件声明显示依赖。
MANIFEST.MF依赖案例:
1)Dependencies: org.javassist, org.apache.velocity
2)Dependencies: org.javassist, org.apache.velocity export //导出依赖
3)Dependencies: org.javassist optional, org.apache.velocity //配置依赖可选属性
deployment-strucure.xml配置:
<jboss-deployment-structure>
<deployment>
<dependencies>
<module name="org.javassist" />
<module name="org.apache.velocity" export="TRUE" />
</dependencies>
</deployment>
</jboss-deployment-structure>
隐式依赖(implicit)的类库是被自动添加,有一个列表列出那些依赖属于隐式依赖,
当然,可以通过jboss-deployment-strucure.xml文件配置排除使用隐式依赖:
<jboss-deployment-structure>
<deployment>
<exclusions>
<module name="org.jboss.logging" />
</exclusions>
</deployment>
</jboss-deployment-structure>
7.多层依赖
当A-->B-->C时,有一个属性叫export="true|false",如果此时B的定义如下:
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="B">
<resources>
<resource-root path="B.jar" />
</resources>
<dependencies>
<module name="C" export="true" />
</dependencies>
</module>
此时export="true",表示C中的类也会在A的类路径下,即当A加载C中的类时
可以成功;如果export="false",则A加载C中的类时会失败,但是B加载C会成功
8.类加载优先级顺序
1)隐式依赖,自动被jboss添加
2)显式依赖,通过MANIFEST.MF或者jboss-deployment-structure.xml添加
3)被打包进入部署包的类,比如war包下的classes或者lib目录
4)外部部署依赖,主要是指EAR部署的时候,有一个lib目录以及EJB 的jar
9.通过maven产生MANIFEST.MF依赖
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<archive>
<manifestEntries>
<Dependencies>
org.javassist, org.apache.velocity
</Dependencies>
</manifestEntries>
</archive>
</configuration>
</plugin>