JBoss Module介绍

来源:互联网 发布:2017化妆品数据分析 编辑:程序博客网 时间:2024/06/10 14:48
从JBoss AS7开始,Classloader这块开始使用全新的JBoss Modules。与传统的使用classpath加载方式相比,JBoss Modules在设计阶段就考虑到了在旧有classpath loading模式下的一些问题。本文通过实例来介绍JBoss Modules的设计思路,新特性以及实际使用方法。

介绍

我们都知道,Java一直使用classpath的方式来加载各种class和jar的资源。这样的方式会造成许多问题,比如下面这些经常会遇到的问题:

# 一个大的项目中,有的classpath当中的资源被加载后可能根本不会被用到,这就造成了系统资源的浪费
# 同一个classpath当中的资源,可能包含多个不同版本的同一个资源,这就造成了版本冲突,可能会导致整个项目无法运行并且很难进行排错,因为我们的项目可能非常大,里面有成百上千个jar,要想找到相冲突的资源,非常困难

针对这些问题,JBoss Modules都从设计上面给出了解决方案:

# 通过使用module.xml描述文件定义模块,在这个描述文件中要包含模块的名称,都包含哪些资源(一般一个模块对应一个jar文件,也可以包含多个jar或其它资源),这些资源的版本号,以及这个模块都依赖于哪些模块。
# 每一个模块都可以实时地加载或卸掉。这样做有很多好处:首先是资源方面的节省,只有需要的模块才被加载(这一点是通过module.xml中定义的模块之间的依赖关系来实现的),这一方式同时来带的好处是:整个系统的加载速度大大提升了。

实例

在AS7的根目录下面有一个jboss-modules.jar,这个就是JBoss Modules本身了。我们可以亲手做一个附合JBoss Modules标准的模块,然后使用jboss-modules.jar来加载我们的模块,这样会对JBoss Modules有一个更为直观的了解。

我们先用Maven来创建一个非常简单的Helloworld项目:

Java代码 复制代码 收藏代码
  1. mvn archetype:create -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=net.bluedash.demo -DartifactId=helloworld


执行上面的mvn命令便生成了一个简单的java项目:

Bash代码 复制代码 收藏代码
  1. liweinan@cute:~/projs/helloworld$ tree
  2. .
  3. |-- pom.xml
  4. `-- src
  5. |-- main
  6. | `-- java
  7. | `-- net
  8. | `-- bluedash
  9. | `-- demo
  10. | `-- App.java
  11. `-- test
  12. `-- java
  13. `-- net
  14. `-- bluedash
  15. `-- demo
  16. `-- AppTest.java


这个项目里面只有一个App.java,这个类中包含一个main方法,里面有一行非常简单的代码:

Java代码 复制代码 收藏代码
  1. System.out.println("Hello, world!");


我们把这个项目使用maven生成jar包:

Java代码 复制代码 收藏代码
  1. mvn package


生成了helloworld-1.0-SNAPSHOT.jar:

Bash代码 复制代码 收藏代码
  1. liweinan@cute:~/projs/helloworld/target$ ls
  2. helloworld-1.0-SNAPSHOT.jar


接下来我们要做的是把这个jar变成一个JBoss Modules可以加载的模块。首先打开AS7的根目录,里面有个modules目录:

Bash代码 复制代码 收藏代码
  1. liweinan@cute:~/projs/as7$ ls
  2. bin docs jboss-modules.jar standalone
  3. bundles domain modules welcome-content


这个目录当中包含了各种模块,我们也将我们的helloworld模块放在这个目录里面,首先为我们的模块创建目录:

Bash代码 复制代码 收藏代码
  1. liweinan@cute:~/projs/as7$ mkdir -p modules/net/bluedash/demo/main


目录创建完成后,我们将在modules/net/bluedash/demo/目录当中创建我们的模块的描述文件module.xml,文件内容如下:

Xml代码 复制代码 收藏代码
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <modulexmlns="urn:jboss:module:1.0"name="net.bluedash.demo">
  3. <main-classname="net.bluedash.demo.App"/>
  4. <resources>
  5. <resource-rootpath="helloworld-1.0-SNAPSHOT.jar"/>
  6. </resources>
  7. <dependencies>
  8. </dependencies>
  9. </module>


针对上面的描述文件的元素做出一些说明:

* module name用于唯一标识这个模块的名称,当做引用这个模块的唯一标识符
* main-class用于指定这个模块的可运行的类
* resources告诉这个模块所包含的资源,我们的模块中包含一个jar
* dependencies用于指定这个模块依赖于哪些其它的模块,我们的模块非常简单,没有依赖其它的AS7中的模块

完成后,需要将jar文件拷贝至模块所在的目录当中:

Bash代码 复制代码 收藏代码
  1. liweinan@cute:~/projs/as7$ cp ~/projs/helloworld/target/helloworld-1.0-SNAPSHOT.jar modules/net/bluedash/demo/main/


完成后的模块目录结构如下:

Bash代码 复制代码 收藏代码
  1. liweinan@cute:~/projs/as7$ tree modules/net/bluedash/demo/
  2. modules/net/bluedash/demo/
  3. `-- main
  4. |-- helloworld-1.0-SNAPSHOT.jar
  5. `-- module.xml
  6. 1 directory,2 files


我们试着加载我们的jar玩一下:

Java代码 复制代码 收藏代码
  1. liweinan@cute:~/projs/as7$ java -jar jboss-modules.jar -mp modules/ net.bluedash.demo
  2. Hello World!


可以看到我们的模块被加载了,同时因为在module.xml中定义了main-class,因此相关的代码在加载时执行了。

有细心的读者可能会问为什么要将jar和描述文件都放在模块目录下面的main目录当中,其实这里面包含了JBoss Modules的slot的概念:在JBoss Modules中,一个模块可以包含多个slot,默认的slot为main。因此,执行:

Java代码 复制代码 收藏代码
  1. java -jar jboss-modules.jar -mp modules/ net.bluedash.demo


相当于执行:

Java代码 复制代码 收藏代码
  1. java -jar jboss-modules.jar -mp modules/ net.bluedash.demo:main


slot的设计目的之一是使得同一module可以存在不同版本,每个版本放在一个slot当中,这样别的module就可以根据需要依赖不同版本的同一module,解决了版本冲突问题。

在JBoss AS7的modules目录中有很多模块,里面的module.xml都是很好的学习资料。AS7当中,大量的组件都被模块化了,可以说模块的概念是构成AS7的基石,比如AS7的bin目录下面有一个管理端的程序:

Bash代码 复制代码 收藏代码
  1. jboss-admin.sh


实际上它就是对cli这个模块的封装,我们学习了JBoss Modules后,可以直接通过模块化的方式来调用管理端模块:

Bash代码 复制代码 收藏代码
  1. liweinan@cute:~/projs/as7$ java -jar jboss-modules.jar -mp modules/ org.jboss.as.cli
  2. You are disconnected at the moment. Type 'connect' to connect to the server or'help' for the list of supported commands.
  3. [disconnected /]


通过理解JBoss Modules的概念,我们可以为使用AS7打下良好的基础,也可以自己为AS7添加所需模块。
原创粉丝点击