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包含的文件如下:

    

  按照約定,模塊聲明被編譯到module-info.class文件中,並輸出到類文件的輸出目錄。

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

  模塊聲明是java程序語言的一部分,而不是他們自己的一個語言或標記,有幾個原因:其中最重要的一個原因是模塊的信息在編譯期和運行期都可用,確保在編譯期和運行期以相同的方式運行。這樣可以防止很多種錯誤,至少在編譯期提前報告,並且可以更早的診斷和修復。

  在一個源文件中表達模塊聲明,它可以連同模塊中的其他文件一起編譯,編譯成的類文件可以被java虛擬機消費。這種方式對於開發者來說非常熟悉,IDE和構建工具也不難支持。

1.2 模塊的零件

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

  

  模塊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模塊化的使用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM