首页 > 解决方案 > 从 Java 8 迁移到 Java 11。在运行时,是否可以从用 Java 8 编译的库中的类文件访问 JDK 内部 API?

问题描述

我了解从我的项目代码中对 JDK 内部 API 的任何访问都将在编译时被 Java 编译器标记。但是用 Java 8 编译的 3rd 方库 JAR 呢?

我的理解是,由于它们是在 JDK 8 或更早版本上编译的,它们最终会出现在类路径中。这些类中的代码可以在运行时访问 JDK 内部 API。那是对的吗?

这是来自 JDK 9 发行说明: JDK 9 Release Notes

所有 JDK 内部类也在运行时封装,但大多数仍然可供类路径上的应用程序和库访问。具体来说,JDK 8 中存在的 JDK 内部包中的所有公共类仍然可供类路径上的代码访问。

所以,如果我的项目依赖于访问 JDK 内部的库 X(在 JDK 8 中编译),我应该没问题吧?

标签: javajava-9java-11java-module

解决方案


不。如果您依赖已从 JDK 中删除的内容,即使是间接依赖,那么在 JDK 8 上编译良好的代码将无法在 JDK 11 上运行时运行。

您依赖于您的代码期望在运行时在类路径中可用的某些类。如果这个期望没有得到满足,它就不会起作用。已故意从 JDK 中删除项目;它们不仅躲避编译器,而且实际上已经消失了。

如果您可以具体说明您所依赖的内部结构,我们可以为您提供更多详细信息。


推荐阅读