JBoss Module介绍

于 2011-11-27 01:47:36 发布

·

289 阅读

·

0

·

0

文章标签:

#modules

#jboss

#java

Java

同时被 2 个专栏收录

11 篇文章

订阅专栏

JBoss

9 篇文章

订阅专栏

本文详细介绍了JBossModules在JBossAS7中的设计思路、新特性和实际使用方法,通过创建并加载模块的实例,解释了如何解决传统classpath加载方式存在的问题,如资源浪费和版本冲突,并展示了如何利用模块化提高系统效率。

摘要生成于

C知道

,由 DeepSeek-R1 满血版支持,

前往体验 >

从JBoss AS7开始,Classloader这块开始使用全新的JBoss Modules。与传统的使用classpath加载方式相比,JBoss Modules在设计阶段就考虑到了在旧有classpath loading模式下的一些问题。本文通过实例来介绍JBoss Modules的设计思路,新特性以及实际使用方法。[b]介绍[/b]我们都知道,Java一直使用classpath的方式来加载各种class和jar的资源。这样的方式会造成许多问题,比如下面这些经常会遇到的问题:# 一个大的项目中,有的classpath当中的资源被加载后可能根本不会被用到,这就造成了系统资源的浪费# 同一个classpath当中的资源,可能包含多个不同版本的同一个资源,这就造成了版本冲突,可能会导致整个项目无法运行并且很难进行排错,因为我们的项目可能非常大,里面有成百上千个jar,要想找到相冲突的资源,非常困难针对这些问题,JBoss Modules都从设计上面给出了解决方案:# 通过使用module.xml描述文件定义模块,在这个描述文件中要包含模块的名称,都包含哪些资源(一般一个模块对应一个jar文件,也可以包含多个jar或其它资源),这些资源的版本号,以及这个模块都依赖于哪些模块。# 每一个模块都可以实时地加载或卸掉。这样做有很多好处:首先是资源方面的节省,只有需要的模块才被加载(这一点是通过module.xml中定义的模块之间的依赖关系来实现的),这一方式同时来带的好处是:整个系统的加载速度大大提升了。[b]实例[/b]在AS7的根目录下面有一个jboss-modules.jar,这个就是JBoss Modules本身了。我们可以亲手做一个附合JBoss Modules标准的模块,然后使用jboss-modules.jar来加载我们的模块,这样会对JBoss Modules有一个更为直观的了解。我们先用Maven来创建一个非常简单的Helloworld项目:mvn archetype:create -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=net.bluedash.demo -DartifactId=helloworld执行上面的mvn命令便生成了一个简单的java项目:liweinan@cute:~/projs/helloworld$ tree.|-- pom.xml`-- src |-- main | `-- java | `-- net | `-- bluedash | `-- demo | `-- App.java `-- test `-- java `-- net `-- bluedash `-- demo `-- AppTest.java这个项目里面只有一个App.java,这个类中包含一个main方法,里面有一行非常简单的代码:System.out.println("Hello, world!");我们把这个项目使用maven生成jar包:mvn package生成了helloworld-1.0-SNAPSHOT.jar:liweinan@cute:~/projs/helloworld/target$ lshelloworld-1.0-SNAPSHOT.jar接下来我们要做的是把这个jar变成一个JBoss Modules可以加载的模块。首先打开AS7的根目录,里面有个modules目录:liweinan@cute:~/projs/as7$ lsbin docs jboss-modules.jar standalonebundles domain modules welcome-content这个目录当中包含了各种模块,我们也将我们的helloworld模块放在这个目录里面,首先为我们的模块创建目录:liweinan@cute:~/projs/as7$ mkdir -p modules/net/bluedash/demo/main目录创建完成后,我们将在modules/net/bluedash/demo/目录当中创建我们的模块的描述文件module.xml,文件内容如下: 针对上面的描述文件的元素做出一些说明:* module name用于唯一标识这个模块的名称,当做引用这个模块的唯一标识符* main-class用于指定这个模块的可运行的类* resources告诉这个模块所包含的资源,我们的模块中包含一个jar* dependencies用于指定这个模块依赖于哪些其它的模块,我们的模块非常简单,没有依赖其它的AS7中的模块完成后,需要将jar文件拷贝至模块所在的目录当中:liweinan@cute:~/projs/as7$ cp ~/projs/helloworld/target/helloworld-1.0-SNAPSHOT.jar modules/net/bluedash/demo/main/完成后的模块目录结构如下:liweinan@cute:~/projs/as7$ tree modules/net/bluedash/demo/modules/net/bluedash/demo/`-- main |-- helloworld-1.0-SNAPSHOT.jar `-- module.xml1 directory, 2 files我们试着加载我们的jar玩一下:liweinan@cute:~/projs/as7$ java -jar jboss-modules.jar -mp modules/ net.bluedash.demoHello World!可以看到我们的模块被加载了,同时因为在module.xml中定义了main-class,因此相关的代码在加载时执行了。有细心的读者可能会问为什么要将jar和描述文件都放在模块目录下面的main目录当中,其实这里面包含了JBoss Modules的slot的概念:在JBoss Modules中,一个模块可以包含多个slot,默认的slot为main。因此,执行:java -jar jboss-modules.jar -mp modules/ net.bluedash.demo相当于执行:java -jar jboss-modules.jar -mp modules/ net.bluedash.demo:mainslot的设计目的之一是使得同一module可以存在不同版本,每个版本放在一个slot当中,这样别的module就可以根据需要依赖不同版本的同一module,解决了版本冲突问题。在JBoss AS7的modules目录中有很多模块,里面的module.xml都是很好的学习资料。AS7当中,大量的组件都被模块化了,可以说模块的概念是构成AS7的基石,比如AS7的bin目录下面有一个管理端的程序:jboss-admin.sh实际上它就是对cli这个模块的封装,我们学习了JBoss Modules后,可以直接通过模块化的方式来调用管理端模块:liweinan@cute:~/projs/as7$ java -jar jboss-modules.jar -mp modules/ org.jboss.as.cliYou are disconnected at the moment. Type 'connect' to connect to the server or 'help' for the list of supported commands.[disconnected /] 通过理解JBoss Modules的概念,我们可以为使用AS7打下良好的基础,也可以自己为AS7添加所需模块。