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项目:
执行上面的mvn命令便生成了一个简单的java项目:
这个项目里面只有一个App.java,这个类中包含一个main方法,里面有一行非常简单的代码:
我们把这个项目使用maven生成jar包:
生成了helloworld-1.0-SNAPSHOT.jar:
接下来我们要做的是把这个jar变成一个JBoss Modules可以加载的模块。首先打开AS7的根目录,里面有个modules目录:
这个目录当中包含了各种模块,我们也将我们的helloworld模块放在这个目录里面,首先为我们的模块创建目录:
目录创建完成后,我们将在modules/net/bluedash/demo/目录当中创建我们的模块的描述文件module.xml,文件内容如下:
针对上面的描述文件的元素做出一些说明:
* module name用于唯一标识这个模块的名称,当做引用这个模块的唯一标识符
* main-class用于指定这个模块的可运行的类
* resources告诉这个模块所包含的资源,我们的模块中包含一个jar
* dependencies用于指定这个模块依赖于哪些其它的模块,我们的模块非常简单,没有依赖其它的AS7中的模块
完成后,需要将jar文件拷贝至模块所在的目录当中:
完成后的模块目录结构如下:
我们试着加载我们的jar玩一下:
可以看到我们的模块被加载了,同时因为在module.xml中定义了main-class,因此相关的代码在加载时执行了。
有细心的读者可能会问为什么要将jar和描述文件都放在模块目录下面的main目录当中,其实这里面包含了JBoss Modules的slot的概念:在JBoss Modules中,一个模块可以包含多个slot,默认的slot为main。因此,执行:
相当于执行:
slot的设计目的之一是使得同一module可以存在不同版本,每个版本放在一个slot当中,这样别的module就可以根据需要依赖不同版本的同一module,解决了版本冲突问题。
在JBoss AS7的modules目录中有很多模块,里面的module.xml都是很好的学习资料。AS7当中,大量的组件都被模块化了,可以说模块的概念是构成AS7的基石,比如AS7的bin目录下面有一个管理端的程序:
实际上它就是对cli这个模块的封装,我们学习了JBoss Modules后,可以直接通过模块化的方式来调用管理端模块:
通过理解JBoss Modules的概念,我们可以为使用AS7打下良好的基础,也可以自己为AS7添加所需模块。
介绍
我们都知道,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 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
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!");
System.out.println("Hello, world!");
我们把这个项目使用maven生成jar包:
- mvn package
mvn package
生成了helloworld-1.0-SNAPSHOT.jar:
- liweinan@cute:~/projs/helloworld/target$ ls
- helloworld-1.0-SNAPSHOT.jar
liweinan@cute:~/projs/helloworld/target$ lshelloworld-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
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
liweinan@cute:~/projs/as7$ mkdir -p modules/net/bluedash/demo/main
目录创建完成后,我们将在modules/net/bluedash/demo/目录当中创建我们的模块的描述文件module.xml,文件内容如下:
- <?xmlversion="1.0"encoding="UTF-8"?>
- <modulexmlns="urn:jboss:module:1.0"name="net.bluedash.demo">
- <main-classname="net.bluedash.demo.App"/>
- <resources>
- <resource-rootpath="helloworld-1.0-SNAPSHOT.jar"/>
- </resources>
- <dependencies>
- </dependencies>
- </module>
<?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$ 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
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.demo
- Hello World!
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
相当于执行:
- java -jar jboss-modules.jar -mp modules/ net.bluedash.demo:main
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
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 /]
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添加所需模块。
- JBoss Module介绍
- jboss module
- JBoss 引用 module 说明
- JBOSS定义Module问题
- JBOSS---Jboss介绍
- jboss+jboss seam介绍
- Jboss介绍
- JBoss介绍
- JBoss介绍
- Jboss介绍
- JBoss介绍
- jboss介绍
- JBoss 介绍
- Dynamic Web Module version 3.0 与JBoss
- Jboss服务器介绍
- JBoss MySql配置介绍
- JBOSS使用介绍
- JBoss介绍及安装
- acegi中文登陆账号问题
- iOS学习之UIPickerView控件的简单使用
- 母版页A>结构设置----html---css B〉注意母版页中还有路径的问题处理。
- 卸载 Appdomain 时出错
- CFileFind简述
- JBoss Module介绍
- android安装与配置
- iOS学习之第二个View使用UITabBarViewController
- 基于Android智能终端的远程控制系统
- 新建应用母版页的网页index.aspx,about.aspx,login.aspx。
- Impala介绍(Cloudera Impala Real-Time Queries in Apache Hadoop, For Real)
- 计划任务之一天一次
- 在一串字符中查找到手机号码,并打印出来
- Mysql 之 root密码重置