2017-12-02 178 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将被忽略的类路径)上工作。 –