1. 程式人生 > >Java 9 揭祕(3. 建立你的第一個模組)

Java 9 揭祕(3. 建立你的第一個模組)

文 by / 林本託

Tips
做一個終身學習的人。

Java 9

在這個章節中,主要介紹以下內容:

  • 如何編寫模組化的Java程式
  • 如何編譯模組化程式
  • 如何將模組的專案打包成模組化的JAR檔案
  • 如何執行模組化程式

在本章中,將介紹如何使用模組 —— 從編寫原始碼到編譯,打包和執行程式。 本章分為兩部分。 第一部分顯示使用命令列編寫和執行模組程式的所有步驟。 第二部分使用NetBeans IDE重複相同的步驟。

到目前,NetBeans IDE仍在開發中,並且不支援所有JDK 9功能。 例如,目前需要NetBeans為建立的每個模組建立一個新的Java專案。 在最終版本中,NetBeans將允許在一個Java專案中擁有多個模組。 當使用命令提示符時,會更具體的JDK 9選項。

本章介紹的程式非常簡單。 當程式執行時,它列印一個訊息和主類所屬模組的名稱。

一. 使用命令提示符

以下小節介紹使用命令提示符建立和執行第一個模組的步驟。

1. 設定目錄

將使用以下目錄層次結構來編寫,編譯,打包和執行原始碼:

C:\Java9Revealed
| --> C:\Java9Revealed\lib
| --> C:\Java9Revealed\mods
| --> C:\Java9Revealed\src
        | --> C:\Java9Revealed\src\com.jdojo.intro

這些目錄在Windows系統上設定的。 在非Windows作業系統上,你也可以設定類似的目錄層次結構。 C:\Java9Revealed是頂層目錄,它包含三個子目錄:lib,mods和src。

src目錄用於儲存原始碼,其中包含一個com.jdojo.intro的子目錄,並建立一個同名的com.jdojo.intro的模組,並將其原始碼儲存在這個子目錄下。 在這種情況下,是否有必要將子目錄命名為com.jdojo.intro? 答案是不。 子目錄可以是不同的名字,或者可以將源直接儲存在src目錄中,而不需要com.jdojo.intro子目錄。 但是,最好將目錄命名為與模組名稱相同的模組的原始碼。 如果遵循這個命名約定,Java編譯器將有一些選項可一次編譯多個模組的原始碼。

使用mods目錄將已編譯的程式碼儲存在展開的目錄層次結構中。 如果需要,可以使用此目錄中的程式碼執行應用程式。

在編譯原始碼之後,將其打包成一個模組化的JAR並將其儲存在lib目錄中。 可以使用模組化JAR來執行程式,也可以將模組JAR提供給可以執行程式的其他開發人員。

在本節的剩餘部分會使用一個目錄(如src或src\com.jdojo.intro)的相對路徑。 這些相對路徑是相對於C:\Java9Revealed目錄。 例如,src表示C:\Java9Revealed\src。 如果使用非Windows作業系統或其他目錄層次結構,請進行適當的調整。

2. 編寫原始碼

你可以選擇自己喜歡的文字編輯器(例如Windows上的記事本)來編寫原始碼。 首先建立一個名為com.jdojo.intro的模組。下面是模組宣告的程式碼。

// module-info.java
module com.jdojo.intro {
    // No module statements
}

模組宣告很簡單。 它不包含模組語句。 將其儲存在src\com.jdojo.intro目錄下名為module-info.java的檔案中。

然後建立一個名為Welcome的類,它將儲存在com.jdojo.intro包中。 請注意,包的名字與模組具有相同的名稱。 但必須保持模組和包名稱相同嗎? 答案是不。 也可以選擇所需的任何其他包名稱。 該類將具有一個主方法public status void main(String [] args)。 該方法將作為應用程式的入口點。 在此方法內列印訊息。

要列印模組的名稱,Welcome 類是它的一個成員。 JDK 9在java.lang包中添加了一個名為Module的類。 Module類的一個例項代表一個模組。 JDK 9中的每個Java型別都是模組的成員,甚至是int,long和char等原始型別。 所有原始型別都是java.base模組的成員。 JDK 9中的Class類有一個名為getModule()的新方法,它返回該類作為其成員的模組引用。 以下程式碼列印了Welcome類的模組名稱。

Class<Welcome> cls = Welcome.class;
Module mod = cls.getModule();
String moduleName = mod.getName();
System.out.format("Module Name: %s%n", moduleName);

Tips
所有原始資料型別都是java.base模組的成員。 可以使用int.class.getModule()獲取int基本資料型別的模組的引用。

下面的程式碼包含是Welcome類中程式碼。並儲存在名為Welcome.java的檔案中,目錄是com\jdojo\intro,它是src\com.jdojo.intro目錄的子目錄。 此時,原始碼檔案的路徑將如下所示:

  • C:\Java9Revealed\src\com.jdojo.intro\module-info.java
  • C:\Java9Revealed\src\com.jdojo.intro\com\jdojo\intro\Welcome.java
// Welcome.java
package com.jdojo.intro;
public class Welcome {
    public static void main(String[] args) {
        System.out.println("Welcome to the Module System.");
        // Print the module name of the Welcome class
        Class<Welcome> cls = Welcome.class;
        Module mod = cls.getModule();
        String moduleName = mod.getName();
        System.out.format("Module Name: %s%n", moduleName);
    }
}

3. 編譯原始碼

使用Java編譯器javac命令來編譯原始碼並將編譯的程式碼儲存在C: java9Revealed\mods目錄下。 javac命令位於JDK_HOME\bin目錄中。 以下命令編譯原始碼。 命令輸入是一行,而不是三行:

C:\Java9Revealed>javac -d mods --module-source-path src
 src\com.jdojo.intro\module-info.java
 src\com.jdojo.intro\com\jdojo\intro\Welcome.java

注意,執行此命令時,C:\Java9Revealed是當前目錄。 -d mods選項告訴Java編譯器將所有編譯的類檔案儲存到mods目錄下。 注意,正在從C:\java9revealed目錄執行命令,因此命令中的mods目錄表示C:\Java9Revealed\mods目錄。 如果需要,可以用-d C:\Java9Revealed\mods替換此選項。

第二個選項--module-source-path src指定src目錄的子目錄包含多個模組的原始碼,其中每個子目錄名稱與包含原始碼的子目錄的模組名稱相同 。 這個選項有一些含義:

  • 在src目錄下,必須將模組的原始檔儲存在子目錄下,該目錄必須與模組命名相同。
  • Java編譯器將映象src目錄下的目錄結構,同時將生成的類檔案儲存在mods目錄中。 也就是說,com.jdojo.intro模組的所有生成的類檔案將儲存在包層次結構的mods\com.jdojo.intro目錄中。
  • 如果不指定此選項,生成的類檔案將直接放在mods目錄下。

javac命令的最後兩個引數是原始檔 —— 一個是模組宣告,一個Welcome類。 如果javac命令成功執行,則在C:\Java9Revealed\mods\com.jdojo.intro目錄下生成以下兩個類檔案:

  • module-info.class
  • com\jdojo\intro\Welcome.class

你完成了原始碼的編譯。

以下命令使用JDK 9之前存在的樣式來編譯com.jdojo.intro模組的原始碼。它僅使用-d選項,該選項指定放置編譯的類檔案的位置。

C:\Java9Revealed>javac -d mods\com.jdojo.intro      src\com.jdojo.intro\module-info.java      src\com.jdojo.intro\com\jdojo\intro\Welcome.java

第二個命令的輸出與上一個命令的輸出是相同的。 但是,如果要在一個命令中編譯多個模組的原始碼,並將編譯的程式碼放在特定於模組的目錄中,則不起作用。

使用javac--module-version選項,可以指定正在編譯的模組的版本。 模組版本儲存在module-info.class檔案中。 以下命令將生成與上一個命令相同的一組編譯檔案,還在module-info.class檔案中儲存了1.0作為模組版本:

C:\Java9Revealed>javac -d mods\com.jdojo.intro
  --module-version 1.0
  src\com.jdojo.intro\module-info.java    
  src\com.jdojo.intro\com\jdojo\intro\Welcome.java

如何確認javac命令在module-info.class檔案中儲存了模組版本? 您可以使用javap命令來解析Java類檔案。 如果指定了一個module-info.class檔案的路徑,那麼javap命令會在模組名稱之後列印模組的定義,其中包含模組的版本(如果存在)。 如果模組版本存在,則列印的模組名稱的格式為moduleName @ moduleVersion。 執行以下命令以驗證上一個命令記錄的模組名稱:

C:\Java9Revealed>javap mods\com.jdojo.intro\module-info.class
Compiled from "module-info.java"
module [email protected] {
  requires java.base;
}

在JDK 9中增強了jar工具。它允許在建立模組化JAR時指定模組版本。

如果要編譯多個模組,則需要將每個原始檔指定為javac命令的引數。 這裡提供一個Windows和UNIX的快捷命令來一次性編譯所有的模組。 在Windows中的一行中使用以下命令:

C:\Java9Revealed>FOR /F "tokens=1 delims=" %A in ('dir src\*.java /S /B') do javac -d mods --module-source-path src %A

該命令迴圈遍歷src目錄下的所有".java"檔案,並一次編譯一個Java檔案。

如果將命令儲存在批處理檔案中並執行批處理檔案來編譯所有原始檔,則需要將%A替換為%%A
該命令的UNIX系統中等價於如下命令:

$ javac -d mods --module-source-path src $(find src -name "*.java")

4. 打包模組程式碼

我們將模組的編譯程式碼打包成一個模組化的JAR。 需要使用位於JDK_HOME\bin目錄中的jar工具。注意, 該命令在一行中輸入,命令的最後一部分是一個點,表示當前目錄。

C:\Java9Revealed>jar --create
 --file lib/com.jdojo.intro-1.0.jar
 --main-class com.jdojo.intro.Welcome
 --module-version 1.0
 -C mods/com.jdojo.intro .

這個命令有如下選項:

  • --create選項表示要建立一個新的模組化JAR。
  • --file選項用於指定新的模組化JAR的位置和名稱。將新的模組化JAR儲存在lib目錄中,其名稱將為com.jdojo.intro-1.0.jar。將模組化JAR的版本指定為1.0。
  • --main-class選項指定public static void main(String[])方法作為應用程式入口。當您指定此選項時,jar工具將在module-info.class檔案中新增一個屬性,其值是指定類的名稱。 jar工具還使用此選項將Main-Class屬性新增到MANIFEST.MF檔案中。
  • --module-version選項將模組的版本指定為1.0。 jar工具將把這些資訊記錄在module-info.class檔案的屬性中。請注意,將模組版本指定為1.0不會影響模組化JAR的名稱。包含1.0以指示其檔名的版本。該模組的實際版本由此選項指定。
  • -C選項用於指定執行jar命令時將用作設定當前目錄。將mods\com.jdojo.intro目錄指定為jar工具的當前目錄。這將使jar工具從該目錄中讀取所有要包含在模組化JAR中的檔案。
  • 命令的最後一部分是一個點(.),這意味著jar工具需要包括當前目錄mods\com.jdojo.intro下所有檔案和目錄。請注意,這個引數和-C選項一起使用。如果不提供-C選項,則該點將被解釋為C:\Java9Revealed目錄,因為該目錄是當前命令列執行的目錄。

當命令成功執行,它建立以下檔案:
C:\Java9Revealed\lib\com.jdojo.intro-1.0.jar

要確保你的模組化JAR包含com.jdojo.intro模組的定義,請執行以下命令。

C:\Java9Revealed>java --module-path lib --list-modules com.jdojo.intro

該命令將模組路徑指定為lib目錄,這意味著lib目錄將用於搜尋應用程式模組。 將com.jdojo.intro作為模組名稱傳遞給--list-modules選項,該選項將列印模組描述以及模組的位置。 如果獲得類似於以下內容的輸出,則模組化JAR已正確建立:

module [email protected] (file:///C:/Java9Revealed/lib/com.jdojo.intro-1.0.jar)
  requires mandated java.base (@9-ea)
  contains com.jdojo.intro

5. 執行程式

使用java命令來執行Java程式。 語法如下:

java --module-path <module-path> --module <module>/<main-class>

這裡,是用於定位模組的模組路徑。 --module選項指定要與其主類一起執行的模組。 如果您的模組化JAR包含主屬性,則需要指定部分,並且將從模組化JAR讀取

Tips
可以分別使用-module-path-module選項的簡寫版本-p-m

以下命令在com.jdojo.intro模組中執行com.jdojo.intro.Welcome類。 當前的目錄是C: Java9Revealed,並且模組化的JAR位於C: java9Revealed\lib\com.jdojo.intro-1.0.jar。

C:\Java9Revealed>java --module-path lib
 --module com.jdojo.intro/com.jdojo.intro.Welcome
Welcome to the Module System.
Module Name: com.jdojo.intro

輸出表示程式已正確執行。 如果在模組程式碼打包到模組化JAR中時指定主類,則可以從命令中省略主類名稱。 我們已經將com.jdojo.intro.Welcome類指定為此模組的主類,因此以下命令的作用與上一個相同:

C:\Java9Revealed>java --module-path lib --module com.jdojo.intro
Welcome to the Module System.
Module Name: com.jdojo.intro

還可以指定包含模組程式碼的目錄作為模組路徑。 已將模組程式碼編譯到mods目錄中。 以下命令的工作原理相同:

C:\Java9Revealed>java --module-path mods
 --module com.jdojo.intro/com.jdojo.intro.Welcome
Welcome to the Module System.
Module Name: com.jdojo.intro

我們嘗試從mods目錄執行模組,只使用模組名稱:

C:\Java9Revealed>java --module-path mods --module com.jdojo.intro
module com.jdojo.intro does not have a MainClass attribute, use -m <module>/<main-class>

收到一個錯誤。 錯誤訊息指示在mods\com.jdojo.intro目錄中找到的module-info.class不包含主類名稱。當宣告模組時,不能在模組宣告中指定主方法或版本。 編譯模組時,只能指定模組版本。 使用jar工具打包時,可以指定模組的主類及其版本。 lib\com.jdojo.intro-1.0.jar中的module-info.class檔案包含主類名,而mods\com.jdojo.intro目錄中的module-info.class檔案則不包含。 如果要執行其編譯程式碼位於分解目錄中的模組,則必須指定主類名稱以及模組名稱。

JDK還提供了-jar選項來從JAR檔案執行主類。 我們使用以下命令執行此模組:

C:\Java9Revealed>java -jar lib\com.jdojo.intro-1.0.jar
Welcome to the Module System.
Module Name: null

看來只有輸出中的第一行是正確的,第二行是不正確的。 它找到了main()方法中執行了程式碼。 它正確列印訊息,但模組名稱為空。

需要了解JDK 9中java命令的行為。-jar選項存在於JDK 9之前。在JDK 9中,型別作為模組的一部分,可以通過模組路徑或類路徑載入。如果通過類路徑載入型別,則該型別成為未命名模組的成員。該型別從其原始模組中失去其成員資格,即使該型別是從模組化JAR載入的。實際上,如果一個模組化的JAR放置在類路徑上,那麼它被視為一個JAR(而不是一個模組化的JAR),忽略它的module-info.class檔案。每個應用程式類載入器都有一個未命名的模組。類載入器從類路徑載入的所有型別都是該類載入器的未命名模組的成員。一個未命名的模組也被表示為一個Module類的例項,該類的getName()方法返回null。

在上一個命令中,模組化JAR com.jdojo.intro-1.0.jar被視為一個JAR,並在其中定義了所有型別 ,被載入為類載入器的未命名模組的一部分。這就是為什麼在輸出中將模組名稱設為null的原因。

java命令如何找到主類名?為jar工具指定主類名時,該工具將主類名稱儲存在兩個位置:

  • module-info.class
  • META-INF/MANIFEST.MF

該命令從META-INF/MANIFEST.MF檔案讀取主類的名稱。

還可以使用--class-path選項的java命令來執行Welcome類。 可以將lib\com.jdojo.intro-1.0.jar模組放置在類路徑上,在這種情況下,它將被視為JAR,Welcome類將被載入到應用程式類載入器的未命名模組中。 就像在JDK 9之前執行類一樣。執行命令如下:

C:\Java9Revealed>java --class-path lib\com.jdojo.intro-1.0.jar
  com.jdojo.intro.Welcome
Welcome to the Module System.
Module Name: null

二. 使用NetBeans IDE

如果你使用命令提示符按照上一節建立第一個模組,則本部分將更容易掌握。 在本節中,將使用NetBeans IDE完成建立第一個模組的步驟。 有關如何安裝支援JDK 9開發的NetBeans IDE,請參閱第1章。 從現在開始,我將使用NetBeans來編寫,程式設計,編譯,打包和執行所有程式。

1. 配置IDE

啟動NetBeans IDE。 如果首次開啟IDE,將顯示一個名為起始頁的視窗, 如果不希望再次顯示,可以取消選中標籤為“啟動時顯示”的複選框,該複選框位於視窗的右上角。 可以通過單擊視窗標題中的X來關閉起始頁。

起始頁

選擇“工具”➤“Java平臺”,顯示“Java 平臺管理器”對話方塊,如果之前配置過JDK 1.8,則會顯示在“平臺”列表中。

Java 平臺管理器

如果在“平臺”列表中看到JDK 9,則你的IDE已配置為使用JDK 9,單擊“關閉”按鈕關閉對話方塊。 如果在“平臺”列表中沒有看到JDK 9,請單擊“新增平臺”按鈕開啟“新增Java平臺”對話方塊,選擇Java Standard Edition單選按鈕。 單擊下一步。

選擇平臺型別

接下來選擇JDK 9的安裝目錄:

指定JDK 9安裝目錄

然後點選“完成”按鈕。

配置完成

最後返回“Java 平臺管理”對話方塊,JDK 9 已經顯示在其中。

JDK 9 已經新增

2. 建立Java工程

選擇“檔案” ➤ “新建專案”,彈出對話方塊,選中“Java 應用程式”,然後下一步。

選擇Java 應用程式

在接下來的視窗中,輸入如下資訊,你可以根據你自己的實際需要做出不同的調整。

專案名稱和位置

專案名稱:com.jdojo.intro
專案位置: C:\Java9Revealed
取消下面兩個複選框的。

點選“結束”按鈕,Java工程建立完成。

Java工程建立完成

建立Java專案時,NetBeans會建立一組標準的目錄。 已在C: Java9Revealed目錄中建立了com.jdojo.intro NetBeans專案。 NetBeans建立子目錄來儲存原始檔,編譯類檔案和模組化JAR。 它將為專案本身建立安裝目錄和檔案。 建立以下子目錄來儲存原始碼,編譯程式碼和模組化JAR。

C:\Java9Revealed
    com.jdojo.intro
        build
           classes
        dist
        src

com.jdojo.intro目錄儲存此專案的所有型別的檔案。 它是以NetBeans專案名稱命名的。 src目錄用於儲存所有原始碼。 build目錄儲存所有生成和編譯的程式碼。 專案的所有編譯程式碼儲存在build\classes目錄下。 dist目錄儲存模組化JAR。 請注意,當類新增到專案時,build和dist目錄是由NetBeans建立的。

3. 設定工程屬性

當前專案仍然設定為使用JDK 1.8。 需要將其更改為使用JDK 9。在專案上右鍵,彈出對話方塊。

JDK 9

再設定源/二進位制格式:

源/二進位制格式

最後點選“確定”按鈕完整工程的配置。

4. 新增模組宣告

在本節中,介紹如何在NetBeans專案中定義名為com.jdojo.intro的模組。 要新增模組定義,需要module-info.java的檔案新增到專案中。 右鍵單擊專案,從選單中選擇新建, 如果看到"Java Module Info"選單項,請選擇該項。 否則,選擇其他。

向專案新增模組定義

Java Module Info

單擊下一步按鈕,顯示“新建Java模組資訊”對話方塊。 單擊完成按鈕完成模組的定義。 將包含模組宣告的module-info.java檔案新增到原始碼目錄的根目錄下。

module-info.java

預設情況下,NetBeans提供的模組名稱與專案名稱相同不過刪除了“.”,名稱的每個部分的初始字母現在是大寫。com.jdojo.intro作為專案名稱,這就是為什麼module-info.java檔案中的模組名稱是ComJdojoIntro的原因。 現在將模組名稱更改為com.jdojo.intro。

module com.jdojo.intro {
}

5. 檢視模組圖

NetBeans IDE允許檢視模組圖。 在編輯器中開啟模組的module-info.java檔案,並在編輯器中選擇“圖形”選項卡以檢視模組圖。

模組圖

可以放大和縮小模組圖,更改其佈局,並將其另存為影象。 在圖區域中右鍵單擊這些圖形相關選項。 可以在圖中選擇一個節點,僅檢視以節點結尾或從節點結尾的依賴關係。 還可以通過移動節點來重新排列模組圖。

6. 編寫原始碼

在本節中,向com.jdojo.intro專案新增一個Welcome類。 該類儲存在com.jdojo.intro包中。 右鍵單擊專案,在彈出的選單中,選擇新建➤Java類,開啟“新建Java類”對話方塊。 輸入Welcome作為類名,com.jdojo.intro作為包。 單擊完成按鈕關閉對話方塊。

新建類

用下面的程式碼替換掉自動生成的程式碼。

package com.jdojo.intro;

public class Welcome {
      public static void main(String[] args) {
        System.out.println("Welcome to the Module System.");
        // Print the module name of the Welcome class
        Class<Welcome> cls = Welcome.class;
        Module mod = cls.getModule();
        String moduleName = mod.getName();
        System.out.format("Module Name: %s%n", moduleName);
    }
}

Welcome類的程式碼

7. 編譯原始碼

使用NetBeans IDE時,Java原始檔將在儲存時自動編譯。 也可以通過取消選擇“儲存時編譯”複選框,在“專案屬性”頁面上關閉專案的“儲存編譯”功能預設情況下,此複選框被選中。

儲存時編譯

如果關閉“專案儲存時編譯”功能,則需要通過構建專案手動編譯原始檔。 可以選擇“執行”➤“構建專案”或按F11構建專案。 所以還是建議開啟儲存時自動編譯的功能。

8. 打包模組程式碼

需要構建專案,為你的模組建立一個模組化JAR。 選擇“執行”➤“構建專案”,或按F11構建專案。 模組化的JAR是在\dist目錄下建立的。 模組化JAR以NetBeans專案名稱命名。 com.jdojo.intro模組的模組化JAR將位於C:\Java9Revealed\com.jdojo.intro\dist\com.jdojo.intro.jar。

目前,NetBeans不支援在模組化JAR中新增主類名稱和模組版本名稱。 可以使用jar命令列工具來更新模組化JAR中的模組資訊。 使用--update選項,如下所示,要寫在一行。

C:\Java9Revealed>jar --update
  --file com.jdojo.intro\dist\com.jdojo.intro.jar
  --module-version 1.0
  --main-class com.jdojo.intro.Welcome

可以使用以下命令驗證com.jdojo.intro的模組化JAR是否正確更新。 應該得到類似的輸出:

C:\Java9Revealed>java --module-path com.jdojo.intro\dist
  --list-modules com.jdojo.intro
module [email protected] (file:///C:/Java9Revealed/com.jdojo.intro/dist/com.jdojo.intro.jar)
  requires mandated java.base (@9-ea)
  contains com.jdojo.intro

NetBeans IDE的最終版本將與JDK 9相同時間釋出,到那時就允許通過IDE新增這些屬性。

9. 執行程式

選擇"執行"➤"執行專案"或按F6執行程式。

如果執行類,右鍵單擊NetBeans IDE中“專案”選項卡中包含main()方法的原始檔(.java檔案),然後選擇執行檔案或選擇檔案,然後按Shift + F6。 Welcome類執行後將列印資訊顯示在輸出面板中。

三. 總結

使用模組開發Java應用程式不會改變Java型別被組織成包的方式。 模組的原始碼在包層次結構的根目錄下包含一個module-info.java檔案。 也就是說,module-info.java檔案放在未命名的包中。 它包含模組宣告。

JDK 9中已經增強了javac編譯器,jar工具和java啟動器以與模組配合使用。 javac編譯器接受新的選項,例如用於定位應用程式模組的--module-path,找到模組原始碼的--module-source-path,以及--module-version來指定正在編譯的模組的版本。 該jar工具允許分別使用--main-class-module-version選項為模組化JAR指定主類和模組版本。 java啟動器可以在類路徑模式,模組模式或混合模式下執行。 要在模組中執行類,需要使用--module-path選項指定模組路徑。 需要使用--module選項指定主類名稱。 主類以/格式指定,其中是包含主類的模組,是包含main()方法的類的完全限定名稱,作為應用程式的執行入口。

在JDK 9中,每個型別都屬於一個模組。 如果從類路徑載入型別,它屬於載入它的類載入器的未命名模組。 在JDK 9中,每個類載入器維護一個未命名的模組,其成員都是該類載入器從類路徑載入的所有型別。 從模組路徑載入的型別屬於定義的模組。

Module類的一個例項在執行時表示一個模組。 Module類在java.lang包中。 使用Module類在執行時瞭解有關模組的所有內容。 Class類在JDK 9中得到了增強。它的getModule()方法返回一個表示此類成員的模組的模組例項。 Module類包含一個getName()方法,它以String形式返回模組的名稱; 對於未命名的模組,該方法返回null。

NetBeans IDE正在更新,以支援JDK 9和開發模組化Java應用程式。 目前,NetBeans允許建立模組,編譯,將其打包成模組化JAR,並從IDE中執行它們。 需要為模組建立一個單獨的Java專案。 其最終版本將允許在一個Java專案中擁有多個模組。 支援新增module-info.java檔案。 NetBeans 具有非常酷的功能,可檢視和儲存模組圖。