自从JBOSS EAP v6.0版本以后不再有lib的概念,JBoss EAP 开始采用模块化结构,服务仅在需要时才会启用,从而提高了启动速度。一切都是module。无论是系统调用的lib,用户编制的lib,或者应用程序引用到的第三方lib都以模块的方式构建起来,并在使用的地方申明具体使用了哪个模块。
JBOSS EAP提供了一种完全的模块化的类加载系统,JBOSS会根据具体的需要来加载或者卸载类,仅仅维护当前需要使用的资源,同时只暴露实际使用的API,也增加了系统的安全性。和以往的JBOSS相比JBOSSEAP6的启动和重启相当迅速,能为我们的开发环境减少更多等待的时间。
由于指定应用依赖的模块,从而避免了以前容易出现的包冲突的问题。
模块
模块是类的一个逻辑组,它被用来进行类加载以及对依赖模块的管理。JBoss EAP 有两种模块:静态(static)和动态(dynamic)。这两种模块的主要区别是如何进行打包。
静态模块在应用程序服务器的 EAP_HOME/modules/ 目录中定义。每个模块都以一个子目录的形式存在(例如 EAP_HOME/modules/com/mysql/)。每个模块目录包括一个子目录,默认为 main 并包括 module.xml 配置文件和所需的 JAR 文件。所有由应用程序服务器提供的 API(包括 Java EE API 以及其它 API)都以静态模块的形式提供。
MySQL JDBC Driver module.xml 文件示例
<?xml version="1.0" ?>
<module xmlns="urn:jboss:module:1.1" name="com.mysql">
<resources>
<resource-root path="mysql-connector-java-5.1.36-bin.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
<module name="javax.transaction.api"/>
</dependencies>
</module>
模块名(com.mysql)必须匹配模块的目录结构,除了 Slot 名称(main)。
动态模块由应用程序服务器为每个 JAR 或 WAR 部署(或一个 EAR 中的子部署)创建并加载。动态模块的名字由部署的归档名获得。因为部署会作为模块加载,所以它们可以配置依赖关系并可用作为其它部署的依赖模块。
只在需要时才加载模块。这通常在部署具有显性或隐性依赖关系的应用程序时才会发生。
类加载
JBoss EAP使用模块化类加载系统来控制已部署应用程序的类路径。该系统比传统的分层式装载机系统提供更多的灵活性和控制。开发人员对其应用程序可用的类进行了细粒度的控制,并且可以将部署配置为忽略应用程序服务器提供的支持其自己的类。
模块化类加载器将所有Java类分离为称为模块的逻辑组。每个模块都可以定义其他模块的依赖关系,以便将该模块中的类添加到其自己的类路径中。由于每个已部署的JAR和WAR文件都被视为模块,开发人员可以通过将模块配置添加到其应用程序来控制其应用程序类路径的内容。
为了类加载的目的,JBoss EAP将所有部署视为模块。这些被称为动态模块。类加载行为因部署类型而异。
WAR部署
WAR部署被认为是单个模块。WEB-INF/lib目录中的类与目录中的类相同WEB-INF/classes。WAR中打包的所有类都将加载相同的类加载器。
EAR部署
EAR部署由多个模块组成,并按以下规则进行定义:
1. lib/EAR 的目录是称为父模块的单个模块。
2. EAR中的每个WAR部署都是单个模块。
3. EAR中的每个EJB JAR部署都是单个模块。
子部署模块(例如EAR中的WAR和JAR部署)对父模块具有自动依赖关系。但是,它们没有彼此的自动依赖关系。这称为子部署隔离,可以在每个部署或整个应用程序服务器上禁用。
子部署模块之间的显式依赖可以通过与其他模块相同的方式添加。
JBoss EAP模块化类加载器使用优先系统来防止类加载冲突。
在部署期间,将为每个部署及其每个依赖项创建一个包和类的完整列表。该列表根据类加载优先级规则进行排序。在运行时加载类时,类加载器将搜索此列表并加载第一个匹配项。这可以防止部署类路径中的相同类和包的多个副本相互冲 突。
类加载器按以下顺序从最高级到最低级加载类:
1. 隐式依赖关系:这些依赖关系是由JBoss EAP自动添加的,比如JAVA EE API。这些依赖项具有最高的类加载器优先级,因为它们包含由JBoss EAP提供的通用功能和API。
有关每个隐式依赖关系的完整详细信息, 请参阅隐式模块依赖关系。
2. 显式依赖关系:使用应用程序的MANIFEST.MF文件或新的可选JBoss部署描述符jboss-deployment-structure.xml文件,将这些依赖关系手动添加到应用程序配置中。
请参阅向显示添加显式模块依赖项以了解如何添加显式依赖项。
3. 本地资源:这些都是在打包部署本身内部,例如类文件WEB-INF/classes或WEB-INF/libWAR文件的目录。
4. 部署间依赖关系:这些依赖于EAR部署中的其他部署。这可以包括libEAR目录中的类或其他EJB JAR中定义的类。
由于JBoss EAP以module形式加载项目。所以在JBoss EAP目录结构中,专门有一个modules文件,文件夹中放置了加载项目所用到的Jar包,每一个Jar包其实就是一个maven项目,每个Jar包有自己所依赖的包,我们可以使用反编译软件了解一下jar的源码以及maven项目的pom文件,详细的了解一下此Jar包。
感谢您的阅读~~