2017-05-25 66 views
6

爲什麼java 9模塊系統具有java.se模塊,它對其他模塊具有傳遞依賴性。與Java 9之前的整個rt.jar不一樣嗎?Java 9中的java.se模塊的重要性是什麼?

module java.se { 
    requires transitive java.desktop; 
    requires transitive java.security.jgss; 
    requires transitive java.security.sasl; 
    requires transitive java.management; 
    requires transitive java.logging; 
    requires transitive java.datatransfer; 
    requires transitive java.sql.rowset; 
    requires transitive java.compiler; 
    requires transitive java.sql; 
    requires transitive java.naming; 
    requires transitive java.prefs; 
    requires transitive java.rmi; 
    requires transitive java.xml.crypto; 
    requires transitive java.management.rmi; 
    requires transitive java.xml; 
    requires transitive java.scripting; 
    requires transitive java.instrument; 
} 
+1

這是爲什麼令人驚訝?這似乎很方便,否則你必須手動包含每個依賴項。 –

+4

'java.se'只包含一組有限的模塊。整套模塊要大得多:JavaFX,XML,Corba等 – ZhekaKozlov

+0

@ JornVernee-我想我們必須手動包含大多數模塊依賴。那些傳遞將自動解決 –

回答

8

據我所知,主要原因是與非模塊化Java EE代碼的兼容性。當編譯或啓動沒有模塊聲明或描述符(定義它的依賴關係)的代碼時,會出現允許JDK允許「查看」哪些模塊的問題。

如果這些都是JDK中的所有模塊,那麼Java EE將會掩蓋放在類路徑上的任何Java EE實現。這是模塊和類路徑之間交互的一個特性(最終在未命名的模塊中):如果一個程序包同時存在於常規模塊和未命名模塊中,則後者將不可見。

要解決這個問題,並不是所有的模塊對於類路徑上的代碼都是可見的。相反,模塊解析(解析應用程序的依賴關係)將從根模塊java.se開始,因此忽略Java EE模塊。

有關更詳細的說明,請看this mail from Alan Bateman,其中他解釋了相應的JEP 261的更改。

+0

謝謝!我認爲向後兼容jar仍然會在jdk-9中。 –

+1

他們完全是! JAR仍然是運送課程的主要容器。唯一的變化是它們可能包含模塊描述符('module-info.class'),在這種情況下它們是_modular JAR_。 – Nicolai

2

java.se模塊是Java 9中應用程序可用的默認模塊集合(又名「根模塊」)。您是對的,java.se模塊約爲舊版JDK的rt.jar中的80%(如果您想要充分rt.jar看看java.se.ee模塊)。

Java 9模塊化的一個關鍵優勢是新的jlink實用程序,它可以將您的JDK「縮小」爲只有所需的模塊。例如,假設您編寫了一個非常簡單的Java應用程序,它僅取決於java.base模塊,並且您希望以儘可能最小的形式進行分發。您可以運行jlink實用程序來創建一個只包含java.base模塊的JDK映像,因爲這是您運行所需的全部應用程序。

再回到java.se模塊,它很可能是愚蠢的編寫requires java.se因爲這會毀了jlink曾經創造了該模塊或依賴任何其他模塊一個漂亮的小JDK圖像的可能性的模塊。在理想的世界中,所有模塊都會聲明他們需要的精確模塊。

+1

緊湊型聚合器模塊在不久前被移除。 – Nicolai

+0

感謝您指出,我已經更新了我的答案。可悲的是,JEP 261頁面仍然提到它們,所以我認爲它們仍然存在...... –