`
阿男bluedash
  • 浏览: 168798 次
  • 性别: 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-modules.jar

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

    Nginx 1.2.1 + JBOSS AS 7 负载配置及Session处理

    文章首先介绍了使用 Nginx 1.2.1 和 JBOSS AS 7 做为应用服务器的理由,然后详细介绍了使用 Nginx 1.2.1 + JBOSS AS 7(standalone 模式)实现负载均衡的配置过程。 在负载均衡方面,文章首先介绍了 JBOSS 官方文档...

    jboss安全性 jboss设置安全性

    ### JBoss安全性设置详解 #### 一、JMX控制台安全性配置 ...以上步骤详细介绍了如何针对JBoss AS中的JMX控制台和Web控制台进行安全性配置,通过这种方式可以有效地限制非授权用户的访问,提高系统的安全性。

    jboss5原理-1(module).docx

    JBoss Microcontainer是JBoss应用服务器的一个核心组成部分,它的出现是为了应对Java世界中POJO(Plain Old Java Objects)的崛起。POJO在企业应用程序和中间件服务中的广泛使用促使JBoss团队寻求一种更加灵活和统一...

    jboss配置数据源

    &lt;module-option name="managedConnectionFactoryName"&gt;jboss.jca:service=LocalTxCM,name=OracleDS&lt;/module-option&gt; &lt;/login-module&gt; ``` 在login-config.xml文件中,需要添加application-policy元素,以便在...

    JBOSS4设置控制台jmx-console登录密码

    &lt;login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule" flag="required"&gt; &lt;module-option name="usersProperties"&gt;props/jmx-console-users.properties&lt;/module-option&gt; &lt;module-option name=...

    Jboss5源代码-官方-第一部分

    每个模块都有自己的类加载器,这在`jboss.module`包中体现。理解模块化设计对于定制和优化JBoss服务器非常重要。 3. **EJB容器**:JBoss作为Java EE的一部分,提供了EJB(Enterprise JavaBeans)容器,负责管理和...

    JBoss 下配置 Oracle 数据源

    本文将详细介绍如何在 JBoss 中配置 Oracle 数据源,包括复制配置文件、编辑配置文件、设置数据源参数等步骤。 一、复制配置文件 首先,我们需要将 %JBOSS_HOME%\docs\examples\jca\oracle-ds.xml 复制到 %JBOSS_...

    Webmin JBoss module-开源

    在本场景中,"Webmin JBoss 模块"是专门为JBoss应用程序服务器设计的一个扩展,它使得JBoss的管理和监控变得更加直观和便捷。 JBoss是Red Hat企业级Java应用程序服务器的前身,基于Java EE(现在称为Jakarta EE)...

    JBoss AS 7 简介

    本文将详细介绍JBoss AS 7的历史背景、设计初衷、核心技术和内部结构,并通过实例来帮助读者更好地理解这一版本的主要特性和优势。 #### JBoss AS 历史概述 JBoss AS自诞生以来就一直致力于为开发者提供稳定可靠的...

    利用jboss 在 Eclipse IDE 开发

    #### JBoss Eclipse IDE介绍 JBoss Eclipse IDE是JBoss Enterprise Middleware System的一部分,与Eclipse SDK紧密集成。它结合了Ant和XDoclet,为跨厂商应用服务器平台提供了开发能力。该IDE支持最新的开发技术,...

    在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 = ...

    jboss7连接oracle驱动及配置

    &lt;module xmlns="urn:jboss:module:1.1" name="com.oracle.jdbc"&gt; &lt;module name="javax.api"/&gt; &lt;module name="javax.transaction.api"/&gt; &lt;/module&gt; ``` 第三步是配置数据源。在JBoss 7的配置文件`...

    在jboss连接oracle

    本文将详细介绍如何在JBoss中配置和连接Oracle数据库。 首先,我们需要了解JBoss与数据库的连接原理。JBoss使用JDBC(Java Database Connectivity)驱动来与数据库建立通信。因此,我们需要在JBoss环境中配置合适的...

    JBoss7配置Mysql5.1数据源.pdf

    根据文件提供的信息,本文将详细介绍JBoss7配置Mysql5.1数据源的过程。 JBoss是一个开源的应用服务器,支持Java EE应用程序,而Mysql是一个广泛使用的开源关系数据库管理系统。在JBoss上配置Mysql数据源是一个常见...

Global site tag (gtag.js) - Google Analytics