2006 年 12 月 14 日
Apache Harmony 是 2005 年 5 月公布的開放源碼 java SE 實現,本文是由 5 部分組成的 進入 Harmony 世界 系列文章的第四篇,這個系列主要介紹 Apache Harmony 項目的內部實現,最新發展現狀和開源 Java 開發的模式,并鼓勵和歡迎大家參與到 Harmony 的社區中來。
本文較具體地介紹了 Harmony 項目類庫(API庫)開發過程當中的經驗,從架構設計和軟件工程的角度,介紹了類庫開發過程當中積累的類庫模塊的劃分、測試優先的開發模式、結對編程、代碼審核等等最佳實踐。
類庫模塊劃分
類庫模塊的劃分,是 Harmony 項目類庫總體設計上的主要特點。通過將龐大的 J2SE 類庫劃分為若干個相對獨立而且小規模的功能模塊,Harmony 的開發者簡化了類庫實現的過程,降低了開發類庫的風險。類庫模塊的劃分原則和具體劃分方式,是項目進行和結構設計實踐當中不斷總結和歸納出來的。
Harmony 模塊化背景和目標
實現一個完整的兼容的開源 J2SE,這是一種很棒的開創性的想法,但它的實現有著相當的難度,有很多的問題需要注重。開源軟件的開發流程,具有一定的自由性和不確定性。通常的情況是,來自世界各地的開發者,在一個組織的統一協調下,分工合作,不定期的提交一些功能模塊,然后集成到一個大的平臺產品當中。這樣的開發方式是開源軟件的固有特征,但是對于 J2SE 這樣的龐大體系,這樣的開發模式會增加產品的風險。為了減小風險,便于平臺的升級和維護,就要充分考慮以下問題:合理的劃分平臺,定義好模塊之間的接口,以及降低耦合性。總結來說有以下幾個目標:
與現有的 J2SE 實現功能上兼容的同時,在基本的大的組件方面也要做到一致。如 JVM、類庫、JIT 組件等等大規模組件必須對應一致。這樣可以使 Java 類庫的開發工作易于治理,開源社區的參與者可以集中開發他擅長的模塊。
為了開發的便利和風險的降低,平臺的模塊必須實現獨立開發,各個模塊之間盡量減少耦合,這樣才可以發揮開源項目的優勢,避免其缺陷。
在 Java 的開源世界里,隨時都有很多開源軟件的出現,假如出現了某些優秀的開源 J2SE 組件,應該答應它們方便的替換進來;另外,假如發現本身某一個模塊實現上的不足,也可以方便的替換出去,而不影響整個平臺。
除開提供完整的 J2SE 實現,這個項目的另外一個有價值之處就是在于為開源社區提供共享的 J2SE 組件。這個目標十分重大,因為一個完整的 J2SE 平臺,本身就意味著了聚集了很多有價值的組件。所以,平臺的設計必須確保這些組件可以方便的被共享和重用。
針對以上目標,在 Harmony 項目中采用了模塊化的劃分方式。在 Sun 公司的最初設計里面,根本沒有考慮過對 Java 模塊化,也沒有開源的想法,所以原有的耦合性是比較大。而且,這個劃分既要有全局的劃分,即把整個 J2SE 劃分為幾個大的組件,如 JVM,API 類庫,Tools 等等,也有對組件內部的劃分,例如把類庫進一步劃分成一些模塊,不同的模塊實現不同的功能。
類庫設計
完整的 J2SE 平臺的模塊化設計,首先應該在最抽象的層次,按照設計目標,劃分出整體的模塊組件,規定好它們的互聯規范,比如對類庫、虛擬機間接口的定義;然后,應該在比較具體的層次,在比較大的組件當中再次劃分子模塊,例如類庫的進一步劃分。
類庫(Class Library)是 J2SE 當中最復雜和最常用的部分。它為 Java 開發者提供了豐富的編程接口,給 Java 應用程序提供了基礎類庫。Harmony 類庫的目標,是要實現一個標準 J2SE 類庫,和現有的 Sun 的 JDK 兼容一致。雖然不會增加特性,但是在完全不涉及 Sun 的源代碼的前提下,僅僅依靠公開的 Java 文檔,設計和開發這樣的類庫,依然是一項艱巨的工作。
Harmony Class Library 分為三十多個模塊。假如我們從上下層次上看,它們主要上分為以下四個大類,主要模塊如圖所示。
應該注重到,這個劃分和 Sun 公司的 J2SE 結構圖并不相同,這是因為,Harmony 為自己項目的特點,對已有的基于包(package)的類庫結構按照功能重新分析和歸類,有的模塊是從包中劃分出來,如 instrument 模塊做 Java 虛擬機的類重定義和治理功能,它本來是 java.lang 包當中的子包,但是由于功能的獨特,所以就被單獨分為一塊。
下面逐一介紹這四大類和主要的模塊。
LUNI 是 Lang、Util、Net、IO 這些模塊的首字母總稱,他們和新的 NIO 模塊一起表示類庫的基礎和核心部分,處于類庫的底層。當然,LUNI 當中也有些獨立分出模塊的子包,如 instrument,management 模塊,這些模塊作為虛擬機監測工具類庫,就不屬于 LUNI。
之所以要把 LUNI 和 NIO 同看作為基礎模塊,是因為它們互相之間有著密切的聯系。在實際實現中,它和 IO 和非常多的底層公用,兩者有緊密的聯系。如 NIO 當中的 SocketChannel 和 NET 中 Socket 基本上就可以共用同一套底層代碼。
新聞熱點
疑難解答