跳到主要内容

JEP 162:为模块化做好准备

概括

进行更改以在未来版本中顺利地最终过渡到模块,提供新工具来帮助开发人员为模块化平台做好准备,并弃用某些严重阻碍模块化的 API。

非目标

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

描述

鉴于Project Jigsaw推迟到以后的版本,本 JEP 提出以下更改:

  • 解决类加载假设 --- 代码库中有几个地方对类加载做出了假设。 Project Jigsaw 中已经发现并修复了许多问题。作为准备模块的一部分,建议对代码库进行更广泛的审核,并在可能的情况下在 JDK 8 中进行修复,以便当我们转向模块时不需要再次更改此代码。

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

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

  • 弃用将严重阻碍模块化的 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。我们还可以探索添加一种implies方法来java.security.Principal消除对com.sun.security.auth.PrincipalComparator.

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

测试

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

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

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

风险和假设

更改实现(例如修复与类加载相关的假设)可能会导致副作用,这是一个很小的风险。与所有错误和功能一样,我们假设 JDK 8 的广泛测试将发现此类问题。

影响

  • JCK:规范的更改可能需要更新相关领域的一致性测试。
  • 兼容性:弃用或计划删除方法或功能需要时间来正确分析影响。