java - 如何让使用 Unsafe 的 java 8 代码在 jdk 8 和 jdk 9 上工作?

标签 java java-8 java-9 unsafe module-info

我在我的 Java8 代码库中使用 sun.misc.Unsafe。这不适用于 Java9。

我想要 Java9 的修复程序,但具有在 Java8 上运行的相同代码库。如果我放入 module-info.java,它将无法工作,因为我的代码库是 Java8。

怎么办?

最佳答案

Andreas comment指向正确的方向,您可以使用 Multi-Release JAR Files .

您可以创建一个包装,这样具有两个 Java JDK 通用代码的类位于根 JAR 中,而您需要覆盖其实现的类位于两个 根 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。

关于java - 如何让使用 Unsafe 的 java 8 代码在 jdk 8 和 jdk 9 上工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47613650/

相关文章:

java - 字符串到参数

java - SQLDeveloper 运行查询但从 hibernate 中获取 "ORA-00979: Not a Group By expression"

java 。我应该使用哪个 @Nullable 将返回值标记为 1?

android - 非法反射访问操作

java - 我需要为 JDK 1.9 下载哪个 Jersey 版本?

java - Hibernate/JPA - 使用 IS NULL 比较时 UUID 的集合无法确定数据类型

java.sql.SQLException : You can't specify target table 'user_details' for update in FROM clause 异常

Java 8 java.time : Adding TemporalUnit in Instant vs LocalDateTime

java - 用 BinaryOperator 替换 switch