跳到主要内容

JEP 162:为模块化做准备

QWen Max 中英对照

概述

进行一些更改,以顺利过渡到未来版本中的模块化,提供新工具来帮助开发者为模块化平台做好准备,并弃用某些对模块化构成重大阻碍的 API。

非目标

这项工作的目标并不是将 Project Jigsaw 中开发的模块系统代码集成到 JDK 8 中。

描述

鉴于 Project Jigsaw 已被推迟到后续版本发布,本 JEP 提议进行以下更改:

  • 解决类加载假设 --- 代码库中有若干地方对类加载进行了假设。在 Project Jigsaw 中已经识别并修复了许多问题。作为模块化准备的一部分,我们建议对代码库进行更广泛的审查,并尽可能在 JDK 8 中修复这些问题,以便在转向模块化时无需再次更改这些代码。

  • 使用 ServiceLoader --- JDK 中有多个 API 拥有自己的服务提供者机制,而不是使用 java.util.ServiceLoader。JAXP 中的各种 FactoryFinder 就是一个例子。这些提供者加载机制对模块化来说是有问题的,因为它们不是标准化的。我们建议更改这些 API 以使用 java.util.ServiceLoader。在某些情况下,可能需要对相关规范进行小范围的修改。

  • 在 JDK 中提供一个命令行工具,以便开发人员可以了解其应用程序和库的静态依赖关系 --- 作为 Project Jigsaw 的一部分,开发了一个有用的类分析器,可以非常容易地识别依赖关系。这个类分析器将被修改,以便轻松识别非标准和 JDK 内部 API 的使用情况,并且将为 javac 在编译使用 JDK 内部 API 的代码时发出的警告提供有益的补充。

  • 弃用那些会对模块化造成重大阻碍的 Java SE API --- 这些 API 将被弃用,并计划在引入模块系统时彻底删除。我们目前计划弃用的方法列表如下:

    java.util.logging.LogManager.addPropertyChangeListener
    java.util.logging.LogManager.removePropertyChangeListener
    java.util.jar.Pack200.Packer.addPropertyChangeListener
    java.util.jar.Pack200.Packer.removePropertyChangeListener
    java.util.jar.Pack200.Unpacker.addPropertyChangeListener
    java.util.jar.Pack200.Unpacker.removePropertyChangeListener
  • 弃用那些会对模块化造成重大阻碍的 JDK 特定 API。目前最成问题的领域是 JAAS,我们计划弃用示例回调处理器 com.sun.security.auth.callback.DialogCallbackHandler。我们还可能探索在 java.security.Principal 中添加 implies 方法,这将消除对 com.sun.security.auth.PrincipalComparator 的需求。

  • 审查对 $JAVA_HOME 中文件的规范性引用,并尽可能将这些引用降级为非规范性状态。通过降级这些引用,可以在未来的版本中更改它们的位置(或格式)。例如,货币属性文件可以移动到模块私有的位置。

测试

更改现有的 API 以使用 java.util.ServiceLoader 可能需要开发新的测试。

新的命令行工具或运行时选项将需要新的测试。

如果定义了标准的 PrincipalComparator API,那么这将需要新的一致性测试和单元测试。

风险与假设

存在一个小风险,即更改实现(例如,修复与类加载相关的假设)可能会导致副作用。正如所有缺陷和功能一样,我们假定对 JDK 8 的广泛测试将揭示此类问题。

影响

  • JCK:规范的变更可能需要对相关领域的符合性测试进行更新。
  • 兼容性:弃用或计划移除方法或功能将需要时间来充分分析其影响。