編譯器與 module-path


假設現在基於某個原因,想要將 範例檔資料夾 中 Hello1 的成果拆分為兩個模組,其中 cc.openhome.util 模組將會包含 cc.openhome.util.Console 類別,而 cc.openhome 模組將會包含 cc.openhome.Main,並依賴在 cc.openhome.util 模組的 cc.openhome.util.Console 類別,最後仍能夠執行顯示出「Hello, World」,該怎麼做呢?

基本上,你可以如〈JVM 與 module-path〉 建立起對應的資料夾與對應的 module-info.java,不過,這次必須在 module-info.java 做點設定,為了練習時的方便,可以直接複製 範例檔資料夾 中 Hello3 資料夾至 C:\workspace,其中已經建立好兩個模組應有的資料夾及 module-info.java 了,不過 module-info.java 都還沒有任何額外的設定。

先來處理 cc.openhome.util 模組,為了讓其他模組能使用此模組下的 API,必須在 module-info.java 中使用 exports 宣告哪些套件是可公開的,因此請開啟 Hello3/src/cc.openhome.util/module-info.java檔案,並如下進行設定:

編譯器與 module-path

如此撰寫之後,此模組中 cc.openhome.util 套件下的 API 就可以被其他模組使用了,現在對 cc.openhome.util 模組進行編譯:

編譯器與 module-path

接下來,因為 cc.openhome 模組會依賴在 cc.openhome.util 模組,你必須在 cc.openhome 模組中的 module-info.java 中使用 requires 宣告依賴的模組,請開啟 Hello3/src/cc.openhome/module-info.java,並如下進行設定:

編譯器與 module-path

接下來可以對 cc.openhome 模組進行編譯,然後執行顯示「Hello, World」:

編譯器與 module-path

可以看到,在使用 javac 進行編譯時,也可以使用 --module-path 指定模組路徑,模組路徑下各模組 module-info.java 編譯好的 module-info.class 中,包括了模組中 API 的能見度與依賴關係,依此決定可否順利通過編譯。