java jigsaw_Java 9,Jigsaw,JPMS和模块:个人探索
java jigsaw
Java 9由于Jigsaw項(xiàng)目而延遲了很多次,您可能會(huì)聽到很多關(guān)于模塊,模塊化和其他內(nèi)容的信息,那么,這到底是什么呢? 什么是模塊化,模塊化平臺(tái)是什么意思? Java平臺(tái)模塊系統(tǒng)(JPMS)? 這將是Java生態(tài)系統(tǒng)的一場(chǎng)革命嗎?
這篇文章是我對(duì)JDK模塊系統(tǒng)最重要的事情的探索。 我將解釋什么是模塊化,為什么需要模塊化以及如何創(chuàng)建模塊化項(xiàng)目。
什么為什么:
可維護(hù)性是軟件設(shè)計(jì)和開發(fā)中最重要的問題之一。 我們需要一個(gè)松散耦合,高度內(nèi)聚,極易讀且可以一眼就能理解的代碼庫(kù)。 我們?cè)O(shè)計(jì)課程并將其整理成包。 到目前為止,一切都很好,但是當(dāng)我們有數(shù)百個(gè)軟件包時(shí), 它們之間的依賴關(guān)系就無法一目了然。 因此,除了包之外,我們還需要其他一些東西來組織我們的代碼庫(kù)并使之更易于維護(hù)。
另一個(gè)問題是java類路徑及其如何運(yùn)行我們的代碼。 所有的jar類和庫(kù)都被展平到類路徑中。 當(dāng)這些jar文件在運(yùn)行時(shí)具有一個(gè)類的多個(gè)版本時(shí),Java ClassLoader只能加載該類的一個(gè)版本,這樣,對(duì)于程序的工作方式將有歧義,并且歧義是一件壞事。 這個(gè)問題如此頻繁,以至于它的名字叫做“ JAR Hell” 。
類路徑的另一個(gè)問題是它不遵循“失敗優(yōu)先”的原則。 您可能缺少類路徑中存在的類,但是生產(chǎn)環(huán)境中不存在。 直到運(yùn)行時(shí)出現(xiàn)JavaClassDefError異常 ,您才能確定缺少什么。 最后,類路徑的最大問題是封裝。 類路徑上的每個(gè)類都可以互相訪問,這是封裝沖突。 我們想要隱藏我們的內(nèi)部API,這就是為什么我們需要另一級(jí)別的封裝( “強(qiáng)封裝” )并控制對(duì)我們包中類的訪問的原因。
模塊將解決這些問題。 什么是模塊? 模塊有一個(gè)名稱,它對(duì)相關(guān)代碼進(jìn)行分組并且是獨(dú)立的。 一個(gè)模塊明確描述了其他模塊需要的內(nèi)容,以及其他模塊可見的部分。 以這種方式,模塊之間的依賴性非常清晰。 我們具有強(qiáng)大的封裝功能,這意味著我們可以隱藏我們的內(nèi)部API,最后,我們現(xiàn)在遵循“故障優(yōu)先”的原則,因此,當(dāng)缺少模塊或沖突時(shí),您將得到一個(gè)錯(cuò)誤。
模塊化JDK使JDK開發(fā)人員可以管理它的巨大復(fù)雜性。 當(dāng)您編寫一個(gè)不使用RMI,CORBA,JavaEE和其他內(nèi)容的小型直接應(yīng)用程序時(shí),為什么需要一個(gè)完整,龐大而繁重的Java運(yùn)行時(shí)環(huán)境? 僅包含所需模塊的運(yùn)行時(shí)映像不是更明智嗎? 現(xiàn)在有了模塊化平臺(tái),這是可能的。
這就是JDK現(xiàn)在的樣子。 在底部,我們有“ java.base ”模塊,每個(gè)其他模塊都隱式或顯式依賴該模塊。 如您所見,此依賴關(guān)系圖是DAG ,這意味著不允許循環(huán)依賴。
下圖實(shí)質(zhì)上顯示了什么是模塊。 每個(gè)模塊都有一個(gè)稱為“ module-info.java”的模塊描述符。
在module-info.java文件中,您描述了模塊的名稱,工作所需的條件以及在該模塊外部可見的軟件包。 例如,您可以看到j(luò)ava.sql導(dǎo)出了哪些包(使其可見)以及需要哪些模塊。
因此,以最簡(jiǎn)單的形式,module-info.java如下圖所示:
在下一節(jié)中,我將展示如何使用這些模塊并創(chuàng)建模塊。
怎么樣:
首先,您需要下載并安裝Java9。您可以在此處找到它。
Java版本
$ java -version java version "9" Java(TM) SE Runtime Environment (build 9+181) Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode讓我們?cè)贗ntelliJ IDEA中構(gòu)建一個(gè)項(xiàng)目:
下圖顯示了如何創(chuàng)建模塊:
創(chuàng)建模塊后,需要在src內(nèi)創(chuàng)建一個(gè)module-info.java文件:
我建立了一個(gè)包含兩個(gè)模塊的項(xiàng)目:“ com.mhrimaz.gui”和“ com.mhrimaz.logic”。 您可以在圖像中看到項(xiàng)目的結(jié)構(gòu):
在com.mhrimaz.logic模塊中,我有兩個(gè)名為“ InternalGreeting”和“ Greeting”的類。
InternalGreeting.java
package com.mhrimaz.logic.internals;public class InternalGreeting {public static String sayHello(String name){return "Hello, This Greeting is internal dear "+ name;} }Greeting.java
package com.mhrimaz.logic;public class Greeting {public static String sayHello(String name){return "Hello, " + name;} }com.mhrimaz.logic的module-info.java如下:
module com.mhrimaz.logic {exports com.mhrimaz.logic; }這意味著軟件包c(diǎn)om.mhrimaz.logic(這是軟件包名稱,不要混淆模塊名稱)在此模塊外部可見,但軟件包c(diǎn)om.mhrimaz.logic.internals不可見。
MianApplication文件是一個(gè)簡(jiǎn)單的JavaFX程序:
package com.mhrimaz.gui;import com.mhrimaz.logic.Greeting; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.layout.StackPane; import javafx.stage.Stage;public class MainApplication extends Application {@Overridepublic void start(Stage primaryStage) throws Exception {Label label = new Label(Greeting.sayHello("Hossein"));StackPane pane = new StackPane();pane.getChildren().add(label);Scene scene = new Scene(pane);primaryStage.setScene(scene);primaryStage.show();} }似乎此程序包不需要導(dǎo)出任何內(nèi)容,它只需要javafx.base和javafx.controls,并且為了使用Greeting類,我們還需要com.mhrimaz.logic。 com.mhrimaz.gui模塊的module-info如下所示:
module com.mhrimaz.gui {requires javafx.base;requires javafx.controls;requires com.mhrimaz.logic; }當(dāng)我們運(yùn)行我們的應(yīng)用程序時(shí),我們將得到一個(gè)異常:
Caused by: java.lang.IllegalAccessException: class com.sun.javafx.application.LauncherImpl (in module javafx.graphics) cannot access class com.mhrimaz.gui.MainApplication (in module com.mhrimaz.gui) because module com.mhrimaz.gui does not export com.mhrimaz.gui to module javafx.graphics 因此很明顯,它表明我們需要導(dǎo)出com.mhrimaz.gui包,這意味著javafx.graphics使用MainApplication將舞臺(tái)傳遞給它,并且您需要將包導(dǎo)出到j(luò)avafx.graphics(注意:您只能導(dǎo)出包到特定模塊或?qū)⑵鋵?dǎo)出到所有模塊)
所以現(xiàn)在module-info.java看起來像這樣:
結(jié)果似乎是Java 9中JavaFX實(shí)現(xiàn)中的錯(cuò)誤,但這是我們的結(jié)果:
故事還沒有結(jié)束,有關(guān)模塊,模塊之間的依賴關(guān)系的大量詳細(xì)信息可以在Java 9 Revealed或Java 9 Modularity一書中閱讀。
翻譯自: https://www.javacodegeeks.com/2017/09/java-9-jigsaw-jpms-modules-personal-exploration.html
java jigsaw
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的java jigsaw_Java 9,Jigsaw,JPMS和模块:个人探索的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑亮点检测工具(亮点测试软件)
- 下一篇: Win10如何隐藏任务栏?Win10隐藏