2017-09-27 53 views
4

Java 9項目Jigsaw的主要目標之一是可靠配置。也就是說,Java 9承諾解決類路徑機制缺陷,該缺陷允許啓動程序運行程序,但不確保所有必需的類都可用於運行時加載,這會導致java.lang.NoClassDefFoundError s。Java中的可靠配置9

這是通過聲明module-info.java中的模塊依賴關係以及全新的--module-path選項來完成的。在啓動Java應用程序之前分析模塊圖。

但是,我仍然可以做到以下幾點。

  1. 可以說我有兩個模塊com.spacey.explorercom.spacey.rocketcom.spacey.explorer使用由com.spacey.rocket模塊定義和導出的類com.spacey.rocket.RocketZ。在編譯和JARing兩個模塊之後,所有的東西都可以正常運行
  2. 現在我從com.spacey.rocket模塊中刪除com.spacey.rocket.RocketZ類型並重新編譯並重新JAR只有這一個模塊。
  3. 我使用新編譯的com.spacey.rocket模塊運行先前編譯的com.spacey.explorer模塊。
  4. 我得到... java.lang.NoClassDefFoundError,這可能是類似4個小時的應用程序正常運行時間後。

有沒有辦法來真正確保運行的Java應用程序不僅模塊圖(模塊路徑)的完整性進行驗證,但也實際類型的無障礙的全面檢查時,做了什麼?

+0

否。模塊系統從不檢查類。 – Mordechai

+0

你能詳細說說你的意思嗎?(3)。如果缺少一個類,如何用新編譯的'c.s.rocket'運行'c.s.explorer'? – nullpointer

+0

@nullpointer與(1)中的完全一樣'java --module -path ../jars-dir --module com.spacey.explorer/com.spacey.explorer.MissionApp' – malloc4k

回答

5

有沒有辦法來真正確保運行的Java應用程序不僅模塊圖(模塊路徑)的完整性進行驗證,但也實際類型的無障礙的全面檢查時,做了什麼?

不在JVM中,沒有。模塊系統在僞像的層面上運行,並且如果一個自稱是正確模塊is present的僞像會很高興。除此之外,不再執行進一步的檢查。

那就是說,JDeps應該可以幫到你。它分析你的項目和它的依賴關係,並在各個班級上進行操作。它會指出找不到的依賴關係。

在您的例子:

$ jdeps -R --module-path jars-dir -m com.spacey.explorer 

> com.spacey.explorer -> com.spacey.rocket not found 
+0

實際上** jdeps ** can做這項工作。還值得添加'-verbose:class'選項以獲得更多信息(類級別)輸出。 – malloc4k

3

我認爲對方的回答可以幫助在技術方面,但除此之外,我覺得你得到了可靠部分有點不對勁。

This談到類路徑:

所有這些都是脆性classpath的結果。這意味着ClassLoaders沒有一個好的機制來區分一個加載的類和另一個同名的類,或者將一個ClassLoader加載的類從另一個加載的類中分離出來。

這模塊提供這個答案:

的Java模塊將提供可靠的配置和強大的封裝。如果你有不兼容性,你會在構建時發現它們,而不是在你的應用程序開始運行之後的某個不確定的時間。

換句話說:我認爲這是對你到底有誤解假設模塊旨在防止所有LinkageError(所有No..FoundError一樣的東西的母親)。模塊讓你更容易構建的東西。你找到一個很好的例子,這並不一定意味着關於運行時問題的完美安全網。換句話說:您對「可靠模塊」的解釋與Jigsaw實際試圖提供的「可靠模塊」的承諾並不同步。