jboss 模块化及类加载总结

最近在深入学习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>



你可能感兴趣的:(jboss 模块化及类加载总结)