Jigsaw項目簡介:Java 7的新模塊系統
本文收集了一些與Jigsaw項目(Project Jigsaw)相關的報道,旨在讓讀者們更加清楚的了解這個Java 7中的新玩意兒是做什么用的。
在Jigsaw項目成為OpenJDK的一部分時的聲明
為了在接下來的幾年中能夠模塊化JDK 7,同時也為了更好地宣傳JSR 294的工作,Sun打算不久之后在OpenJDK社區中創建Jigsaw項目。
該努力必然會創建一個簡單、低層次的模塊系統,其設計將聚焦于模塊化JDK這個目標。開發者可以在自己的代碼中使用該模塊系統,Sun也會全力支持該系統,但它并不會成為官方Java SE 7平臺規范的一部分,也不一定會得到其他SE 7實現的支持。
如果未來的Java SE平臺包含了特定的模塊系統,那么Sun將提供一種方式來移植Jigsaw模塊以使之符合相應的標準。同時,我們還會積極地尋求與其他模塊系統交互的方式,尤其是OSGi。
模塊化JDK這個目標應該是可以實現的,尤其是Apache Harmony已經證明了JDK是可以被模塊化的(使用OSGi)。然而這個目標卻因另一個原因而變得更加有趣:它將在JCP外實現。
由于缺少可視化的發展過程,再加上閉門造車的實現,對于大多數人來說很難參與進JSR 277,更別提對其獻計獻策了。通常這會導致標準的誤入歧途,使得標準過于關注實現的細節而忽視了通用性。不僅如此,這還會導致標準成為事后諸葛亮——想解決問題時(例如奇數的版本號)卻發現已經太遲了。根據聲明所述,JSR277還處于“領導地位”,但它實際已死。
從JSR277中分離出的JSR294(以前可是個龐然大物,不過現在已經模塊化了)是個很大的進步;它將引入一些語言上的變化,這會使得模塊化的實現獨立于任何特定的模塊化進程。
從聲明中看到的激動人心的事情還有OSGi已經成為模塊化的事實上的標準了,這種合作是件好事。但這不一定意味著它將基于OSGi實現,事實上,它只是建議***與OSGi而不是其他方式合作:
JSR 277的JAM模塊系統并不適合作為模塊化JDK的基礎,那么OSGi框架如何呢?該模塊系統非常成熟、穩定和健壯。其核心甚至已經在Java虛擬機中實 現出來了,也就是Apache Harmony。OSGi并沒有與Java語言集成,相反,它構建在Java SE平臺之上而不是其中。
這***的問題也能解決。Sun現在計劃直接與OSGi聯盟合作以便OSGi框架的未來版本能充分利用JSR 294的特性進而能和語言集成的更加緊密。
08年底,Java 7新特性展望
現在的Java程序員,或者說所有語言的程序員,都面臨著日益增多的開源和商業類庫,往往要花費很長時間來管理其依賴關系。今天的一個普通企業應用程序往往要依賴數十個外部JAR文件,其本身往往就能包含數十個不同團隊開發的更小內部工程。我們一直在堅持尋找更好的方式來管理日益復雜的依賴關系,以使我們的開發更具重用性,部署更加完整。現在出現了越來越多的類似Maven的依賴關系管理系統,以及諸如OSGi之類的運行時部署系統,這一點正是反應了這種需求的增長趨勢。
在Java SE 7發展初期,兩個重要的JSR曾經試圖解決依賴關系管理問題,分別是JSR 294:Java編程語言中的改進模塊性支持(Improved Modularity Support in the Java Programming Language)和JSR 277:Java模塊系統(Java Module System),兩者分別關注Java模塊概念的開發和部署方面。一個模塊(module)就是多個實現相同目標且相互存在聯系的類的集合,與JAR類似,但是,根據開發和部署的需要,一個模塊的范圍可以是一個JAR的一部分,也可以是幾個JAR的集合。在2008年中期,JSR 294被簡化并合并到JSR 277中,以便同一個專家組能夠先后研究這兩個方面。
在2008年12月份,Sun再次重新審視這一計劃,宣布在OpenJDK社區中創建Jigsaw項目,以在明年實現JDK 7模塊化。JSR 277和Java模塊系統的研究將被放到Java SE 7推出之后進行,而JSR 294將被重新恢復研究。Sun已經聲明了此舉的意圖是,與OSGi聯盟更緊密的配合,以便JSR 294模塊可以被OSGi所使用。
在Java SE 7中有一個問題將得到解答,即Sun將如何來使用module關鍵字,它是最初的JSR 294中的一個重要概念,預計將包含在下一平臺版本中。
假定有一個名為Flapjack的項目由幾個Java包(package)組成,該項目包含在基包(base package)中的一個public APIs,和實現這個API的幾個內部包:
·org.flapjack - public API classes
·org.flapjack.impl - 實現類
·org.flapjack.util - 實用類
在Java SE 6中,如果你需要在基包中放置一個工廠類(factory class),以實例化內部執行包中的API類,你需要將這個實現類設為public,這樣它們才可以從API包中被看到。由于跨越了不同的包,沒有辦法既允許API以factory方法對類實例化,又不允許外部類直接執行它。
JSR 294模塊將允許你聲明整個包集合為一個模塊,你只需要在源程序中加入以下一個新的聲明:
module org.flapjack;你可以將這個聲明加在你的項目中每一個源程序文件中,也可以將其增加到package-info.java文件中,然后一次將其應用到整個包。雖然module是一個新關鍵字,它是一個“限制性”關鍵字,只有在特定位置時才被作為關鍵字來處理;因此,它可以在任何其它地方作為普通Java標識符來使用。這使得它擴展了語言的功能,同時又保持了其向后兼容性。
除了新的聲明外,你還可以把module關鍵字當作一個新的可見性修飾符使用,你可以用它來定義一個類,使其僅對同一個模塊中的其它類可見,Listing 1演示了module關鍵字的這種用法。
- Listing 1
- module org.flapjack;
- package org.flapjack.impl;
- import org.flapjack.Flapjack;
- module class FlapjackImpl implements Flapjack {
- }
***,你可以定義一個新的module-info.java偽類,使用元數據來注釋該模塊,增加諸如版本、主類、導入的依賴模塊、導出資源和許多其它預定義或特定的模塊注釋等。值得注意的是,與現有的package-info.java文件一樣,這個新的module-info.java文件使用了一個無效Java源文件名稱,可以避免與已經存在的文件可能發生沖突。
在編譯時,JSR 294讓你可以使用javac來編譯你的類。至于在JVM中,Jigsaw項目將如何規定模塊的組成、加載和驗證,尚需拭目以待。
09年5月,JavaOne前夕對Jigsaw的展望
……這個新的模塊系統的***部分就是JSR-294,即所謂的超級包。也正是這個規范闡釋了Java語言的模塊部分的概念。
JSR-294引入了新的可見性關鍵字“module”。如果一個成員擁有這樣的可見性,那就意味著它只對同一模塊中的成員可見。它會創建一個內部的 API,只有模塊本身能調用。就此看來,“public”關鍵字應當只在聲明一個公共的API時才用。而在其他情況下,應當使用“module”或者有更多限制的可見性關鍵字。當然,一旦語言中有了“module”關鍵字,那么模塊之間的可見性限制將會由編譯器來負責檢查。
JSR-294也允許定義依賴性。你可以在某個給定版本中,定義某個模塊依賴于另一模塊。比如:
- //org/netbeans/core/module-info.java
- @Version("7.0")
- @ImportModule(name="java.se.core", version="1.7+")
- module org.netbeans.core;
***一句表明“org.netbeans.core”模塊依賴“java.se.core”的1.7版本或者更高。這類似于Maven的依賴性或者 OSGi的導入。你也可以暫時不要管這些語法,因為將來語法可能會另有變化。重要的是,這兒的依賴是在module-info.java中定義的,會被編譯成class文件。而OSGi中,依賴則是在普通的文本文件中定義的。
Jigsaw項目是這個新模塊系統的第二部分。我預計它會是JSR-294特定于Sun的實現,也會是Sun JDK的模塊化實現。既然創建完整的JDK模塊化是有必要的,Sun就希望把標準庫分裝成模塊。這直接簡化了JRE中的內容整合。整個JRE除了Swing之外的所有內容因此都能夠在移動設備上運行。它還有可能為語言引入新的標準API,而無需再等待整個平臺的新版本發布。目前看起來,這個項目絕對有希望實現。
但我對此還有個擔憂,那就是,專有的Jigsaw和JSR標準之間的關系并不清晰,正如Mark Reinhold所說的:
對Jigsaw的投入無疑會創建出一個簡單的、低層次的模塊系統,它的設計會嚴格地朝著JDK模塊化的目標而發展。開發人員可以把這個模塊系統運用到他們的代碼中去,Sun對這個模塊系統也會是絕對的支持,但它不會是Java SE 7平臺規范的官方部分,也可能不會被其他SE 7實現所支持。
這段話說的不是很清楚,當中有很多疑問。他的意思是說創建的模塊只能在Sun JRE中運行嗎?還是想說,如果開發者寫了“@ImportModule(name="java.se.core", version="1.7+")”,那么這個模塊只能在Sun JRE中運行,而不能在IBM JRE環境中運行嗎?或者他的意思是不是說Sun會以某種方式把它的JRE分割成許多模塊,而Oracle會選擇另外的方式去分割嗎?(譯者注:至少現在看來,不太會有這樣的可能了,因為Oracle剛剛收購了Sun)。我們希望都不是,因為還有“編寫一次,到處運行”的原則。
細究起來問題更多。我們并不清楚Jigsaw項目的主要目標是什么。據項目本身所宣布的主要目標來看,它要實現的是Sun JRE的模塊化,但如果純粹是要實現模塊化的話,就不需要對語言做任何改變。Sun可以對JRE進行模塊化,而不修改Java語言本身。
這些語言上的變化會不會成為Sun JRE模塊化帶來的副產品?如果是,那就徹底錯了!語言變化必須是一等公民,而不是專屬的副產品。
【更多關于Java 7的文章推薦】