如何让使用 Unsafe 的 java8 代码在 jdk8 和 jdk9 上工作?
How to have the java8 code that uses Unsafe working on jdk8 and jdk9?
我在 Java8 代码库中使用 sun.misc.Unsafe
。这不适用于 Java9。
我想要 Java9 的修复程序,但使用在 Java8 上运行的相同代码库。如果我输入 module-info.java
,它将不起作用,因为我的代码库是 Java8.
怎么办?
points in the correct direction, you can make use of the Multi-Release JAR Files.
您可以创建一个包装,这样 类 和 Java JDK 的代码都在根 JAR 中,而您需要覆盖的那个both root jar 以及 META-INF/versions/9 中的实现。正如 JEP 所指出的:-
在不支持MRJARs的JDK中,只有类和根目录下的资源可见。
在支持 MRJAR 的 JDK 中,对应于任何后续 Java 平台版本的目录将被忽略;它会首先在对应于当前运行主要Java平台发布版本的Java平台特定目录中搜索类和资源,然后搜索较低版本,最后是 JAR 根目录。
例如,在 Java 9 JDK 上,就好像有一个特定于 JAR 的类路径首先包含版本 9 文件,然后是 JAR根;在 Java 8 JDK 上,此类路径将仅包含 JAR 根目录。
编辑:- Here is a sample project for a similar packaging created with the help of a JetBrains blog 使用 IntelliJ2017.3.
我在 Java8 代码库中使用 sun.misc.Unsafe
。这不适用于 Java9。
我想要 Java9 的修复程序,但使用在 Java8 上运行的相同代码库。如果我输入 module-info.java
,它将不起作用,因为我的代码库是 Java8.
怎么办?
您可以创建一个包装,这样 类 和 Java JDK 的代码都在根 JAR 中,而您需要覆盖的那个both root jar 以及 META-INF/versions/9 中的实现。正如 JEP 所指出的:-
在不支持MRJARs的JDK中,只有类和根目录下的资源可见。
在支持 MRJAR 的 JDK 中,对应于任何后续 Java 平台版本的目录将被忽略;它会首先在对应于当前运行主要Java平台发布版本的Java平台特定目录中搜索类和资源,然后搜索较低版本,最后是 JAR 根目录。
例如,在 Java 9 JDK 上,就好像有一个特定于 JAR 的类路径首先包含版本 9 文件,然后是 JAR根;在 Java 8 JDK 上,此类路径将仅包含 JAR 根目录。
编辑:- Here is a sample project for a similar packaging created with the help of a JetBrains blog 使用 IntelliJ2017.3.