使用JBoss Modules来模块化Java
本文的英文原文Modularized Java with JBoss Modules是JBoss Modules的作者David寫的,由HollisChuang翻譯在使用JBoss Modules來模塊化Java中。轉載請注明出處!!!
一年前Mark Reinhold(Sun/Oracle的頂尖Java工程師之一)在JavaOne上宣稱“classpath已死”,在之后它又寫了一系列的文章來闡述這一觀點,并且宣告Java的未來是模塊化。與此同時,JDK7的發布已經大幅推遲,我們可能在2012,或以后才能見到JDK中java模塊的實現。而JSR294的參與人員一直是走走停停,緩慢的尋求一個和java語言結合緊密的java模塊化標準,這可能是因為需要語言,二進制代碼和打包方面的支持。
我一直在想商討起草一個可用而且不錯的模塊化標準用不了這么長時間。我用在JBossAS7概念證明(proof-of-concept)時創建的JBoss Modules證明了我的想法。
什么是模塊(Module)?
如果你沒有關注JDK7的發展,你可能都不知道自己錯過了這個概念。
模塊由一些類、資源集合而成,并且關聯一個類加載器。一模塊可以依賴另外一個模塊。 從被依賴的模塊里導出(export)的類和資源對于依賴它的模塊里邊的類是可見的(visible)。可見是指一個類加載器里加載的類能夠“看到”另外一個加載器里的類(譯者注:其實就是可以調用其api)。導出(export)一個類或者資源意味著這個類可以被依賴看到。
所以一個模塊系統提供一種方法將類和資源打包成為模塊,并且在運行時建立一個類加載的圖表,這樣所有表達的依賴關系都可以被這個模塊系統實現。
模塊(Module)的突出優點
在Java中運行應用程序的傳統方法是使用著名的classpath機制。它會創建一個application的類加載器,并且把所有相關jar文件資源匯聚到一起成為一個大塊(blob)。
假如你有一個非常龐大的應用,其中包含了很多的jar文件,并且有些jar在可能根本不會被用到,或者有些jar會有多個相互沖突的不同版本。這些問題我們習慣性的稱之為”JAR Hell“. (譯者注:有過web開發經驗的都知道,很多classNotFound類型的錯誤都是由于jar包沖突或者版本不一致導致的)
模塊可以極大的緩解這個問題。如果所有的jar都打包成為模塊,一個jar再也不會看到依賴里一個沖突版本的類,或者加載到一個根本不需要加載的資源。同時,如果一個模塊用到才被加載能夠極大的提高大型應用的啟動時間。
還不趕快行動?
JBoss Modules是一個獨立的運行在JDK6及以上版本的模塊系統。它支持以下特性(或者更多):
1、高效的使用內存,提供高性能,多線程類加載實現, 在o(1)的時間復雜度內加載任何的類和資源。
2、可擴展的模塊加載系統,允許用戶配置其他可替代實現的模塊定義/加載策略。
3、方便使用的本地模塊加載器,能夠用一種簡單的可預測的結構從文件系統上加載Jar文件,或者是展開的目錄
4、簡單的啟動過程(參看以下內容)
5、提供一系列運行時的API ,通過這些API可以加載模塊,獲得模塊的類加載器,在運行時創建模塊,擴展JDK service加載機制,使其成為一個能夠識別模塊,
6、能夠提供對平臺native代碼更多的管理。
一個模塊化程序使用以下命令啟動:
java -jar jboss-modules.jar -mp path/to/modules my.main.module.name
在模塊路徑(-mp)中需要制定默認模塊加載器需要搜素加載模塊的根目錄。一個模塊使用簡單的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提供了很多擴展的功能去嚴格控制
哪些包可以被導出(export)和導入(imported),所以你可以從你的 Jar文件里選擇性的不包含一些資源(這樣使用預打包的jar文件時將變得更為簡單)
參考資料
Modularized Java with JBoss Modules
from:?http://www.hollischuang.com/archives/854
總結
以上是生活随笔為你收集整理的使用JBoss Modules来模块化Java的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Ovirt 笔记】JBoss modu
- 下一篇: Hello World With JBo