`
阿男bluedash
  • 浏览: 167977 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JBoss Module介绍

阅读更多
从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项目:

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$ ls
helloworld-1.0-SNAPSHOT.jar


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

liweinan@cute:~/projs/as7$ ls
bin               docs              jboss-modules.jar standalone
bundles           domain            modules           welcome-content


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

liweinan@cute:~/projs/as7$ mkdir -p modules/net/bluedash/demo/main


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

<?xml version="1.0" encoding="UTF-8"?>

<module xmlns="urn:jboss:module:1.0" name="net.bluedash.demo">
  <main-class name="net.bluedash.demo.App"/>
  
  <resources>
    <resource-root path="helloworld-1.0-SNAPSHOT.jar"/>
  </resources>
  
  <dependencies>
  </dependencies>
</module>


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

* 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.xml

1 directory, 2 files


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

liweinan@cute:~/projs/as7$ java -jar jboss-modules.jar -mp modules/ net.bluedash.demo
Hello 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:main


slot的设计目的之一是使得同一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.cli
You 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添加所需模块。
分享到:
评论

相关推荐

    JBoss 引用 module 说明(重新上传)

    JBoss 引用自定义 Module 的示例

    JBoss 引用 module 说明

    NULL 博文链接:https://rainbow702.iteye.com/blog/2065353

    jboss-modules.jar

    JBoss Modules 是一个适用于Java的...JBoss Module实现了一个线程安全的,快速的,高并发的类加载器委派(delegating)模型,再加上一个可扩展的模块解析引擎,形成一个独特的,简单的,强大的应用程序执行和分布系统。

    在JBOSS下自定义JAAS登录模块的示例

    本示例利用JBoss提供的...配置JBoss主目录下的server/default/conf下的login-config.xml,加入如下的内容: &lt;br&gt; &lt;application-policy name = "testLoginModule"&gt;&lt;br&gt; &lt;authentication&gt;&lt;br&gt; &lt;login-module code = ...

    Java模块化类加载JBossModules.zip

    JBoss Modules 是模块化的类加载系统。JBoss Modules 是独立实现了一个 Java 模块化(非层次的)类加载和执行环境。换句话说,就是加载所有 JARs 到一个平滑的类路径,每个库都是一个模块。JBoss Modules 实现一个...

    jboss5原理-1(module).docx

    The JBoss Microcontainer project is about many things. The Microcontainer's features range from reflection abstraction, a virtual file system, a simple state machine to transparent AOP integration, a ...

    Webmin JBoss module-开源

    JBoss应用程序服务器的Webmin模块。

    jboss 7.1.1 Final 的jsp热部署解决方案

    3. Open module.xml (jboss-as-7.1.1.Final/modules/org/jboss/as/web/main) and add the following line &lt;!--resource-root path="jboss-as-web-7.1.1.Final.jar"/--&gt; &lt;resource-root path="jboss-as-web-7.1.1...

    jboss-modules, 模块化加载系统.zip

    jboss-modules, 模块化加载系统 这是JBoss模块项目。JBoss模块是Java模块化的( 非分级) 类加载和执行环境的独立实现。 也就是说,每个类库装入的不是一个单独的类路径,而是将每个库变成一个只依赖于它所依赖的确切...

    jboss-as-7.1.1.Final

    EJB3.1 JBoss7.0.2 EclipseJuno-helloworld实现 2013-01-06 02:59:54 分类: Java EJB3.1 JBoss7.1 Eclipse3.7---helloworld实现 一、环境配置: JDK:正常配置 Eclipse:正常下载,解压(V3.7) JBoss:正常下载,...

    jboss-modules-1.15.GA.jar

    当时遇到这个问题org.jboss.naming.remote.client.InitialContextFactory(WFLYNAM0027 : ClassNotFoundException: org.jboss.naming.remote.client.InitialContextFactory) 去外网下载了这个,成功通过了

    Module Framework Design 2008(模块化开发框架)

    Module Framwork Design 2008 是一个集成式的 B/S 免费开发工具,帮助企业快速设计应用系统,集成了日志、联接池、性能优化、权限控制、数据展现,常规模块功能(增加、删除、修改、查询、导出、排序)实现,采用JAVA...

    jbossCompressLogHandler:为 jboss 压缩日志文件处理程序

    jbossCompressLogHandler 为 jboss 压缩日志文件处理程序 (*) 针对 jBoss 客户端 jar 编译: ... (*) 将 jar 和 module.xml 复制到此文件夹中: 复制 C:\source\customLogger\CompressHandler.jar C:\jboss-as-

    jboss-mongo-module:一个 jboss 模块,用于为每个 jndi 配置 mongo-databases

    jboss-mongo-module 一个 jboss 模块,用于为每个 jndi 配置 mongo-databases 构建状态 配置 &lt; object-factory name = " java:global/mongoClient " module = " de.adorsys.oss.mongo-jndi " class = ...

    module-creator:JBoss 模块创建者

    #JBoss 模块创建者创建 JBoss 模块的非常简单的脚本。 任何更复杂的事情都是愚蠢的,因为此时您可以只编写 XML。 也许这可以用来启动一个模块,然后从那里修改 XML。 用法示例: java -jar module-creator.jar \ --...

    jboss_modulo_grupo2:JBoss组2的模块

    jboss_module_group2 JBoss组2的模块

    PasswordVaultUsersRolesLoginModule:使用 JBoss 密码库作为密码的 JAAS 登录模块

    PasswordVaultUsersRolesLoginModule 使用 JBoss 密码库作为密码的 JAAS 登录模块。 这个版本是专门为 JBoss EAP 6.1.0 设计的。 此登录模块基于内置的 ...module xmlns="urn:jboss:module:1.1" name="o

Global site tag (gtag.js) - Google Analytics