從JBoss AS7開始,Classloader這塊開始使用全新的JBoss Modules。本文簡單介紹說明JBoss Modules的設計思路,以及給出一個例子說明這一設計思路。
html
咱們都知道,Java一直使用classpath的方式來加載各類class和jar的資源。這樣的方式會形成許多問題,好比下面這些常常會遇到的問題:
java
JBoss Modules 是一個適用於Java的模塊化(非分層)類加載以及執行環境的實現。換句話說,不一樣於Java傳統的使用單個類加載器載入classpath中的全部JAR文件,每個庫(library,能夠理解爲完成某一個功能的一系列jar的組合)成爲一個module,該module僅連接其依賴的其餘module,而再也不依賴其它任何資源。JBoss Module實現了一個線程安全的,快速的,高併發的類加載器委派(delegating)模型,再加上一個可擴展的模塊解析引擎,造成一個獨特的,簡單的,強大的應用程序執行和分佈系統。
JBoss Modules被設計爲可以和現有的library或者application一塊兒工做而不須要任何的修改,這是由於它簡單命名和解析策略。不像OSGi,JBoss Modules並無實現一個容器;而是一個瘦的啓動包裝器,在一個模塊化環境執行一個應用。這時,你的應用接管控制權,模塊化則準備好在須要時裝載和鏈接各模塊。此外,只有當一個模塊被依賴的時候,它纔會被裝載(並不會爲了解析目的而裝載),這意味着,模塊化應用程序的性能僅依賴於實際使用的模塊數(並在模塊被使用的時候),而不是系統中的模塊總數目。而且,模塊能夠在任什麼時候候由用戶卸載。
git
一個模塊化程序使用如下命令啓動:
github
java -jar jboss-modules.jar -mp path/to/modules my.main.module.name
一個模塊使用簡單的XML描述符進行定義,如:
api
<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 Modules 與 OSGI 相比:
安全
本示例代碼位於 https://github.com/kylinsoong/wildfly-architecture/tree/master/modules/quickstart。
併發
根據前面軟件安裝及資料下載中gituhb安裝部分獲取示例代碼經過以下命令編譯運行:
app
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
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=$?
<?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 -mp modules/ org.jboss.modules.quickstart