JBoss 系列八十五: JBoss Modules 簡單介紹

概述

從JBoss AS7開始,Classloader這塊開始使用全新的JBoss Modules。本文簡單介紹說明JBoss Modules的設計思路,以及給出一個例子說明這一設計思路。
html

JBoss Modules 介紹

咱們都知道,Java一直使用classpath的方式來加載各類class和jar的資源。這樣的方式會形成許多問題,好比下面這些常常會遇到的問題: 
java

  •  一個大的項目中,有的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並無實現一個容器;而是一個瘦的啓動包裝器,在一個模塊化環境執行一個應用。這時,你的應用接管控制權,模塊化則準備好在須要時裝載和鏈接各模塊。此外,只有當一個模塊被依賴的時候,它纔會被裝載(並不會爲了解析目的而裝載),這意味着,模塊化應用程序的性能僅依賴於實際使用的模塊數(並在模塊被使用的時候),而不是系統中的模塊總數目。而且,模塊能夠在任什麼時候候由用戶卸載。
git

JBoss Modules 使用

一個模塊化程序使用如下命令啓動:
github

java -jar jboss-modules.jar -mp path/to/modules my.main.module.name

在模塊路徑(-mp)中須要指定默認模塊加載器須要搜素加載模塊的根目錄。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-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安裝部分獲取示例代碼經過以下命令編譯運行:
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

本示例是模擬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
相關文章
相關標籤/搜索