JBoss 系列八十五: JBoss Modules 简单介绍
概述
從JBoss AS7開始,Classloader這塊開始使用全新的JBoss Modules。本文簡單介紹說明JBoss Modules的設計思路,以及給出一個例子說明這一設計思路。
JBoss Modules 介紹
我們都知道,Java一直使用classpath的方式來加載各種class和jar的資源。這樣的方式會造成許多問題,比如下面這些經常會遇到的問題:?
?一個大的項目中,有的classpath當中的資源被加載后可能根本不會被用到,這就造成了系統資源的浪費
同一個classpath當中的資源,可能包含多個不同版本的同一個資源,這就造成了版本沖突,可能會導致整個項目無法運行并且很難進行排錯,因為我們的項目可能非常大,里面有成百上千個jar,要想找到相沖突的資源,非常困難
針對這些問題,JBoss Modules都從設計上面給出了解決方案:?
通過使用module.xml描述文件定義模塊,在這個描述文件中要包含模塊的名稱,都包含哪些資源(一般一個模塊對應一個jar文件,也可以包含多個jar或其它資源),這些資源的版本號,以及這個模塊都依賴于哪些模塊。
每一個模塊都可以實時地加載或卸掉。這樣做有很多好處:首先是資源方面的節省,只有需要的模塊才被加載(這一點是通過module.xml中定義的模塊之間的依賴關系來實現的),這一方式同時來帶的好處是:整個系統的加載速度大大提升了
JBoss Modules 定義?
JBoss Modules 是一個適用于Java的模塊化(非分層)類加載以及執行環境的實現。換句話說,不同于Java傳統的使用單個類加載器載入classpath中的所有JAR文件,每一個庫(library,可以理解為完成某一個功能的一系列jar的組合)成為一個module,該module僅鏈接其依賴的其他module,而不再依賴其它任何資源。JBoss Module實現了一個線程安全的,快速的,高并發的類加載器委派(delegating)模型,再加上一個可擴展的模塊解析引擎,形成一個獨特的,簡單的,強大的應用程序執行和分布系統。
JBoss Modules被設計為能夠和現有的library或者application一起工作而不需要任何的修改,這是因為它簡單命名和解析策略。不像OSGi,JBoss Modules并沒有實現一個容器;而是一個瘦的啟動包裝器,在一個模塊化環境執行一個應用。這時,你的應用接管控制權,模塊化則準備好在需要時裝載和連接各模塊。此外,只有當一個模塊被依賴的時候,它才會被裝載(并不會為了解析目的而裝載),這意味著,模塊化應用程序的性能僅依賴于實際使用的模塊數(并在模塊被使用的時候),而不是系統中的模塊總數目。并且,模塊可以在任何時候由用戶卸載。
JBoss Modules 使用
一個模塊化程序使用以下命令啟動:
java -jar jboss-modules.jar -mp path/to/modules my.main.module.name
在模塊路徑(-mp)中需要指定默認模塊加載器需要搜素加載模塊的根目錄。my.main.module.name 指定要運行的模塊名稱。
一個模塊使用簡單的XML描述符進行定義,如:
<module xmlns="urn:jboss:module:1.0" name="org.jboss.msc">
?
? ? <main-class name="org.jboss.msc.Version"/>
?
? ? <resources>
? ? ? ? <resource-root path="jboss-msc-1.0.0.Beta3.jar"/>
? ? </resources>
?
? ? <dependencies>
? ? ? ? <module name="org.jboss.logging"/>
?
? ? ? ? <!-- Optional deps -->
?
? ? ? ? <module name="javax.inject.api" optional="true"/>
? ? ? ? <module name="org.jboss.threads" optional="true"/>
? ? ? ? <module name="org.jboss.vfs" optional="true"/>
? ? </dependencies>
</module>
在jboss-moduels.jar里有一個schema文件來定義模塊描述符的格式,因此集成到你喜歡的IDE中會很容易。JBoss Moduels提供了很多擴展的功能去嚴格控制什么java包是“exported"或者“imported',所以你可以從你的 Jar文件里選擇性的不包含一些資源(這樣使用預打包的jar文件時將變得更為簡單)。
JBoss Modules 與 OSGI
JBoss Modules 與 OSGI 相比:
JBoss Modules更簡單。一個Jar文件是你所有需要去運行模塊化的應用。
它更為小巧:沒有osgi的sevice層,或者其他OSGI提供的更高層次的功能。它只做一件事情,并且要把它做好。
同時,它的功能又十分強勁。它可以成為OSGI實現的可以使用的類加載框架。
示例
本示例代碼位于 https://github.com/kylinsoong/wildfly-architecture/tree/master/modules/quickstart。
根據前面軟件安裝及資料下載中gituhb安裝部分獲取示例代碼通過如下命令編譯運行:
cd wildfly-architecture/modules/quickstart/
mvn clean dependency:copy-dependencies install
ant
會生成build目錄,進入到build/QuickStart/bin,執行示例啟動腳本:
[kylin@localhost bin]$ ./quickstart.sh
會有如下輸出:
Welcome to Modular Class Loading QuickStart 1.0.0
本示例是模擬JBoss 7啟動,接下來我說明啟動的過程:
quickstart.sh中指定了啟動模塊為org.jboss.modules.quickstart:
if [ "x$LAUNCH_DEMO_IN_BACKGROUND" = "x" ]; then
? ? # Execute the JVM in the foreground
? ? eval \"$JAVA\" $JAVA_OPTS \
? ? ? ? -Ddemo.home.dir=\"$DEMO_HOME\" \
? ? ? ? -jar \"$DEMO_HOME/jboss-modules-1.3.0.Beta3.jar\" \
? ? ? ? -mp \"$DEMO_HOME/modules\" \
? ? ? ? org.jboss.modules.quickstart \
? ? ? ? "$@"
? ? DEMO_STATUS=$?
QuickStart/modules/system/layers/base/org/jboss/modules/quickstart/main/module.xml中定義org.jboss.modules.quickstart的文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="org.jboss.modules.quickstart">
?
? ? <main-class name="org.jboss.modules.quickstart.Main"/>
?
? ? ? ? <resources>
? ? ? ? <resource-root path="modules-quickstart.jar"/>
? ? </resources>
?
? ? <dependencies>
? ? </dependencies>
</module>
同樣我們也可以使用java -jar的方式運行本示例:
java -jar -mp modules/ org.jboss.modules.quickstart
---------------------?
作者:ksoong?
來源:CSDN?
原文:https://blog.csdn.net/kylinsoong/article/details/18136883?
?
總結
以上是生活随笔為你收集整理的JBoss 系列八十五: JBoss Modules 简单介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OSGI动态加载删除Service bu
- 下一篇: 【Ovirt 笔记】JBoss modu