天天看點

JAVA9子產品化詳解(一)——子產品化的定義JAVA9子產品化詳解(一)——子產品化的定義

JAVA9子產品化詳解(一)——子產品化的定義

前言

java9已經出來有一段時間了,今天向大家介紹一下java9的一個重要特性——子產品化。子產品化系統的主要目的如下:

  • 更可靠的配置,通過制定明确的類的依賴關系代替以前那種易錯的類路徑(class-path)加載機制。
  • 強大的封裝,允許一個元件聲明它的公有類型(public)中,哪些可以被其他元件通路,哪些不可以。

這些特性将有益于應用的開發者、類庫的開發者和java se平台直接的或者間接地實作者。它可以使系統更加健壯,并且可以提高他們的性能。

一、定義子產品化

為了提高可靠的配置性和強大的封裝性,我們将子產品化看作是java程式元件的一個基本的新特性,這樣它對開發者和可支援的工具更加友好。一個子產品是一個被命名的,代碼和資料的自描述的集合。它的代碼有一系列包含類型的包組成,例如:java的類和接口。它的資料包括資源檔案(resources)和一些其他的靜态資訊。

1.1 子產品的聲明

一個子產品的自描述表現在它的子產品聲明中,它是java程式語言中的一個新的結構,最簡單的可能的子產品聲明僅僅是指定子產品的名字

module com.foo.bar { }
           

一個或更多個requires項可以被添加到其中,它通過名字聲明了這個子產品依賴的一些其他子產品,在編譯期和運作期都依賴的。

module com.foo.bar {
    requires org.baz.qux;
}
           

最後,exports項可以被添加,它可以僅僅使指定包(package)中的公共類型可以被其他的子產品使用。

module com.foo.bar {
    requires org.baz.qux;
    exports com.foo.bar.alpha;
    exports com.foo.bar.beta;
}
           

如果一個子產品的聲明中沒有exports項,則它根本不向其他子產品輸出任何的類型。

按照約定,子產品聲明的源代碼被放在了子產品源檔案結構的根目錄,檔案的名字叫module-info.java。例如:子產品com.foo.bar包含的檔案如下:

圖檔1

按照約定,子產品聲明被編譯到module-info.class檔案中,并輸出到類檔案的輸出目錄。

子產品的名字,像包的名字一樣,必須不能重複。命名子產品的推薦方式是使用反轉域名的方式,它長期被推薦使用到包的命名。子產品的名字經常是它的輸出包的字首,但是這個關系也不是強制的。子產品的聲明既不包括版本号,也不包括它依賴子產品的版本号。這是有意這樣的:解決版本選擇問題不是子產品化系統的目的,這個問題最好留個建構工具和容器應用。

子產品聲明是java程式語言的一部分,而不是他們自己的一個語言或标記,有幾個原因:其中最重要的一個原因是子產品的資訊在編譯期和運作期都可用,確定在編譯期和運作期以相同的方式運作。這樣可以防止很多種錯誤,至少在編譯期提前報告,并且可以更早的診斷和修複。

在一個源檔案中表達子產品聲明,它可以連同子產品中的其他檔案一起編譯,編譯成的類檔案可以被java虛拟機消費。這種方式對于開發者來說非常熟悉,IDE和建構工具也不難支援。

1.2 子產品的零件

存在的工具已經可以建立,處理,消費jar檔案,為了采用和遷移簡單,我們定義了子產品jar檔案。一個子產品jar檔案非常像一個普通的jar檔案,除了在根目錄包含了一個module-info.class。例如上面的com.foo.bar子產品jar檔案包含以下的内容:

圖檔2

子產品jar檔案可以作為子產品使用,在這種情況下,module-info.class包含了子產品的聲明它可以放在普通的類路徑下,這種情況下,module-info.class将被忽略。子產品jar檔案允許類庫的維護者裝載一個單一的零件,它可以作為一個子產品工作(在java9以後)也可以作為一個普通的jar檔案工作。我們希望java9的實踐者提升jar工具,使得它更容易的生成子產品jar檔案。

為了子產品化java平台的相關實作,我們介紹了一個新的零件格式,它超越了jar檔案,容納了本地代碼、配置檔案、和其他的不能自适應的資料類型。這種格式促使子產品聲明表達式的另外一個優點,把它們編譯到class檔案中,這個class檔案是獨立的,這種新的格式,暫時命名為“JMOD”,它被标準化是一個公開的議題。

1.3 子產品描述

編譯子產品聲明到一個類檔案的優點是這個類檔案有了一個精确定義和可擴充的格式,我們認為module-info.class,它包含了代碼級别的編譯模式,裡邊插入的其他變量在初始化時也會被編譯。

一個IDE或者打包工具可以插入一些包含标記資訊的變量,例如:子產品的版本、标題、描述、和許可等。這些資訊在編譯期和運作期都會被子產品系統映射成可使用的資訊。它也可以被下遊工具建構時使用。指定的變量的集合将被标準化,但是其他的工具和架構也可以定義額外的需要的變量。沒有标準化的變量在子產品系統中是沒有效果的。

1.4 平台子產品

java9将使用子產品化系統将平台分割成若幹個子子產品。java9平台的實作者可以包含其中的所有子產品,也可以是其中的一些。

子產品系統中明确知道的子產品是基礎子產品,它被命名為java.base。基礎子產品定義和輸出所有平台的核心包,包括子產品系統本身:

module java.base {
    exports java.io;
    exports java.lang;
    exports java.lang.annotation;
    exports java.lang.invoke;
    exports java.lang.module;
    exports java.lang.ref;
    exports java.lang.reflect;
    exports java.math;
    exports java.net;
    ...
}
           

基礎子產品總是實時的,其他的每一個子產品都隐式的依賴基礎子產品。其他的平台子產品将通過“java.”的字首分享,例如:java.sql的資料庫連接配接,java.xml處理xml檔案,java.log處理日志,java9沒有定義的,将會通過“jdk.”的字首分享出來。

至此,java9的子產品化先定義到這裡,翻譯的不好,大家見諒,稍後會繼續介紹java子產品化的使用。