Java 平台模組系統 (JPMS) 代表了 Java 平台自誕生以來最重要的架構變化之一。作為一個廣泛使用 Java 應用程式的人,我親眼目睹了這個強大的功能如何改變了我們建立和組織程式碼的方式。
Java 9 中引入的模組系統提供了一種在比套件更高層級組織程式碼的基本方法。從本質上講,模組是一個獨立的單元,它明確聲明其依賴項以及它對其他模組可用的內容[1]。這是對傳統的基於類別路徑的方法的革命性改變,在傳統的基於類別路徑的方法中,所有程式碼基本上都可以被其他所有程式碼存取。
讓我們從基本的模組聲明開始:
module com.myapp.core { requires java.base; exports com.myapp.core.api; provides com.myapp.core.spi.Service with com.myapp.core.impl.ServiceImpl; }
這個簡單的聲明封裝了幾個關鍵概念:模組命名、依賴宣告和套件導出[2]。模組系統在編譯時和執行時強制執行這些邊界,提供比以前更強的封裝。
建立模組化應用程式時,結構通常如下所示:
myapp/ ├── src/ │ ├── module-info.java │ └── com/ │ └── myapp/ │ └── Main.java └── out/
這是一個簡單的模組化應用程式的完整範例:
// module-info.java module com.myapp { requires java.logging; exports com.myapp.api; } // com/myapp/api/Service.java package com.myapp.api; public interface Service { String getMessage(); } // com/myapp/internal/ServiceImpl.java package com.myapp.internal; import com.myapp.api.Service; public class ServiceImpl implements Service { public String getMessage() { return "Hello from modular service!"; } }
JPMS 最強大的功能之一是其強大的封裝機制[4]。與傳統的公共/私有存取修飾符不同,模組級封裝會阻止存取內部實作細節,即使它們被標記為公共。
考慮這個場景:
module com.myapp.core { exports com.myapp.core.api; // Internal packages are not exported // com.myapp.core.internal remains hidden }
即使內部包中的類別是公共的,除非明確導出,否則無法從模組外部存取它們[1]。與前模組 Java 相比,這代表了封裝性的顯著改進。
JPMS 透過 require 指令引入明確依賴聲明。這有助於防止經常困擾 Java 應用程式的「JAR 地獄」問題[3]。以下是通常管理依賴關係的方式:
module com.myapp.service { requires com.myapp.core; requires java.sql; requires transitive com.myapp.common; }
requires 傳遞指令特別有趣,因為它允許依賴轉發,使所需的模組可用於任何依賴於此的模組[2]。
模組系統與Java的ServiceLoader機製完美整合:
module com.myapp.core { uses com.myapp.spi.Plugin; } module com.myapp.plugin { provides com.myapp.spi.Plugin with com.myapp.plugin.impl.PluginImpl; }
這在服務介面和實作之間創造了清晰的分離,從而實現了真正的插件架構[8]。
將現有應用程式移轉到 JPMS 可能具有挑戰性。最常見的問題包括:
module com.myapp.core { requires java.base; exports com.myapp.core.api; provides com.myapp.core.spi.Service with com.myapp.core.impl.ServiceImpl; }
為了幫助遷移,Java 提供了 --add-exports 和 --add-opens 命令列選項[5]:
myapp/ ├── src/ │ ├── module-info.java │ └── com/ │ └── myapp/ │ └── Main.java └── out/
模組系統透過以下方式實現更好的運行時最佳化:
您可以使用 jlink 建立自訂運行時映像:
// module-info.java module com.myapp { requires java.logging; exports com.myapp.api; } // com/myapp/api/Service.java package com.myapp.api; public interface Service { String getMessage(); } // com/myapp/internal/ServiceImpl.java package com.myapp.internal; import com.myapp.api.Service; public class ServiceImpl implements Service { public String getMessage() { return "Hello from modular service!"; } }
測試需要特別考慮。這是典型的測試模組設定:
module com.myapp.core { exports com.myapp.core.api; // Internal packages are not exported // com.myapp.core.internal remains hidden }
許多建置工具為測試模組化應用程式提供特定支援。例如,Maven 使用適當配置的 maven-surefire-plugin [8]。
讓我們來看一個更完整的模組化應用程式範例:
module com.myapp.service { requires com.myapp.core; requires java.sql; requires transitive com.myapp.common; }
這種結構創造了清晰的關注點分離,同時保持強大的封裝和顯式依賴關係[11]。
模組系統從根本上改變了我們建立 Java 應用程式的方式。雖然過渡可能具有挑戰性,特別是對於現有應用程式而言,但可維護性、安全性和效能方面的好處使其值得。隨著生態系統的不斷成熟,我們看到越來越多的函式庫和框架採用 JPMS,從而更輕鬆地建立真正的模組化應用程式。
Java 開發的未來是模組化的,掌握 JPMS 對於 Java 開發人員來說變得越來越重要。無論您是開始一個新項目還是維護現有項目,理解這些概念都將幫助您建立更強大且可維護的應用程式。
有關更多此類見解和故事,請訪問我們的 https://techkoalainsights.com/
一定要鼓掌和追蹤我 TechKoala Insights 了解更多這樣的故事
投資者中心 |智慧生活 |
時代與迴響 |
令人費解的謎團 |
印度教 |
菁英開發 |
JS學校
以上是Java 模組的釋放:超安全、快如閃電的應用程式背後的秘密武器的詳細內容。更多資訊請關注PHP中文網其他相關文章!