2017-12-02 262 views
4

我在我的Java8代碼庫中使用了sun.misc.Unsafe。這在Java9中不起作用。如何讓java8代碼使用不安全的jdk8和jdk9?

我想修復Java9,但使用與Java8相同的代碼庫。如果我把module-info.java,它不會工作,因爲我的代碼庫是Java8。

怎麼辦?

+1

從Oracle購買昂貴的支持合同(和/或)提交錯誤報告。 –

+0

在Java 9下執行時嘗試'java --add-modules jdk.unsupported ...'。 – Andreas

+0

@Andreas不幸的是,我不能強制用戶使用這個標誌(它是我擁有的庫)。 – igr

回答

2

Andreas comment指向正確的方向,你可以使用Multi-Release JAR Files

您可以創建一個包裝,使得與普通的代碼在Java JDK中的類都在根JAR,而一個在您需要覆蓋的實現是在根罐子以及META-INF/versions/9。正如JEP所述: -

  • 在不支持MRJAR的JDK中,只有根目錄中的類和資源將可見。

  • 在支持MRJAR的JDK中,與任何後續Java平臺版本相對應的目錄都將被忽略;它會首先在與當前正在運行的主要Java平臺發行版本對應的Java平臺特定目錄中搜​​索類和資源,然後搜索較低版本的那些目錄,最後搜索JAR根目錄。例如,在Java 9 JDK上,就好像有一個JAR特定的類路徑,其中首先包含版本9文件,然後是JAR根;然後,在Java 8 JDK中,此類路徑將只包含JAR根。

編輯: - Here是一個JetBrains blog使用IntelliJ2017.3的幫助下創建了一個類似的包裝樣本項目。

+6

當您爲> = JDK 9使用不同的代碼時,MR JAR確實很有用。但是,目前還不清楚它是否需要。如果海報有一個使用sun.misc.Unsafe的庫,那麼它應該在JDK 9的類路徑上工作,就像它在JDK 8和更舊的版本中一樣。如果海報正在創建一個模塊,那麼它將'需要jdk.unsupported',它應該在模塊路徑(或者module-info.class將被忽略的類路徑)上工作。 –