JEP 162: Prepare for Modularization | 为模块化做准备
摘要
进行平滑过渡到未来发布的模块化版本的更改,为开发人员提供新工具以准备模块化平台,并废弃某些对模块化产生显著影响的 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 的使用,并且会为在编译使用 JDK 内部 API 的代码时 javac 发出的警告提供一个有用的补充。
- 废弃 Java SE APIs,这些 API 将对模块化构成重大障碍 --- 这些 API 将被废弃,并计划在引入模块系统时彻底删除。目前我们计划废弃的方法列表如下:java
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:更改规范可能需要更新相关领域的符合性测试。
- 兼容性:废弃或计划删除方法或功能将需要时间来适当分析影响。