从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 Modules 是一个适用于Java的...JBoss Module实现了一个线程安全的,快速的,高并发的类加载器委派(delegating)模型,再加上一个可扩展的模块解析引擎,形成一个独特的,简单的,强大的应用程序执行和分布系统。
文章首先介绍了使用 Nginx 1.2.1 和 JBOSS AS 7 做为应用服务器的理由,然后详细介绍了使用 Nginx 1.2.1 + JBOSS AS 7(standalone 模式)实现负载均衡的配置过程。 在负载均衡方面,文章首先介绍了 JBOSS 官方文档...
### JBoss安全性设置详解 #### 一、JMX控制台安全性配置 ...以上步骤详细介绍了如何针对JBoss AS中的JMX控制台和Web控制台进行安全性配置,通过这种方式可以有效地限制非授权用户的访问,提高系统的安全性。
JBoss Microcontainer是JBoss应用服务器的一个核心组成部分,它的出现是为了应对Java世界中POJO(Plain Old Java Objects)的崛起。POJO在企业应用程序和中间件服务中的广泛使用促使JBoss团队寻求一种更加灵活和统一...
<module-option name="managedConnectionFactoryName">jboss.jca:service=LocalTxCM,name=OracleDS</module-option> </login-module> ``` 在login-config.xml文件中,需要添加application-policy元素,以便在...
<login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule" flag="required"> <module-option name="usersProperties">props/jmx-console-users.properties</module-option> <module-option name=...
每个模块都有自己的类加载器,这在`jboss.module`包中体现。理解模块化设计对于定制和优化JBoss服务器非常重要。 3. **EJB容器**:JBoss作为Java EE的一部分,提供了EJB(Enterprise JavaBeans)容器,负责管理和...
本文将详细介绍如何在 JBoss 中配置 Oracle 数据源,包括复制配置文件、编辑配置文件、设置数据源参数等步骤。 一、复制配置文件 首先,我们需要将 %JBOSS_HOME%\docs\examples\jca\oracle-ds.xml 复制到 %JBOSS_...
在本场景中,"Webmin JBoss 模块"是专门为JBoss应用程序服务器设计的一个扩展,它使得JBoss的管理和监控变得更加直观和便捷。 JBoss是Red Hat企业级Java应用程序服务器的前身,基于Java EE(现在称为Jakarta EE)...
本文将详细介绍JBoss AS 7的历史背景、设计初衷、核心技术和内部结构,并通过实例来帮助读者更好地理解这一版本的主要特性和优势。 #### JBoss AS 历史概述 JBoss AS自诞生以来就一直致力于为开发者提供稳定可靠的...
#### JBoss Eclipse IDE介绍 JBoss Eclipse IDE是JBoss Enterprise Middleware System的一部分,与Eclipse SDK紧密集成。它结合了Ant和XDoclet,为跨厂商应用服务器平台提供了开发能力。该IDE支持最新的开发技术,...
本示例利用JBoss提供的...配置JBoss主目录下的server/default/conf下的login-config.xml,加入如下的内容: <br> <application-policy name = "testLoginModule"><br> <authentication><br> <login-module code = ...
<module xmlns="urn:jboss:module:1.1" name="com.oracle.jdbc"> <module name="javax.api"/> <module name="javax.transaction.api"/> </module> ``` 第三步是配置数据源。在JBoss 7的配置文件`...
本文将详细介绍如何在JBoss中配置和连接Oracle数据库。 首先,我们需要了解JBoss与数据库的连接原理。JBoss使用JDBC(Java Database Connectivity)驱动来与数据库建立通信。因此,我们需要在JBoss环境中配置合适的...
根据文件提供的信息,本文将详细介绍JBoss7配置Mysql5.1数据源的过程。 JBoss是一个开源的应用服务器,支持Java EE应用程序,而Mysql是一个广泛使用的开源关系数据库管理系统。在JBoss上配置Mysql数据源是一个常见...