跳到主要内容

JEP 161: 紧凑型配置文件

QWen Max 中英对照

概述

定义 Java SE 平台规范的几个子集 Profiles,以便那些不需要整个平台的应用程序可以在小型设备上部署和运行。

目标

  1. 定义这些配置文件本身。
  2. 定义一些方法,以便在运行时识别当前的配置文件。
  3. 确保结果是可测试的,这样就可以针对每个配置文件的实现运行适当的合规性和质量测试。
  4. 增强现有的 JDK 工具,以支持创建可以运行在特定配置文件上的应用程序。
  5. 在可能的范围内考虑未来过渡到基于模块系统的更灵活的方法。

非目标

此提案的目的并非定义一个模块系统。

动机

此功能的主要动机是允许那些不需要整个 Java SE 平台的应用程序在资源受限的设备上运行。例如,一个不使用 Swing/AWT/2D 图形堆栈的应用程序,或者使用 Java FX 的应用程序,通过运行在一个不包含这些 API 的配置文件(Profile)之上,可以实现相当大的空间节省。

更广泛地说,此特性旨在支持当前基于 Java ME Connected Device Configuration (CDC) 构建的应用程序迁移到 Java SE 平台的适当配置文件,这是将 CDC 与 Java SE 融合的长期努力的一部分。

作为一项次要好处,该功能可能会使那些捆绑了自己的 Java 运行时环境(JRE)的应用程序的下载时间更快。

描述

我们目前设想定义三个 Profiles,并以叠加层的方式排列,以便每个 Profile 包含所有比它小的 Profiles 中的 API。每个 Profile 将指定一组特定的 Java API 包;相应的 JRE 将在可行的范围内仅包括支持这些 API 所需的类、本地代码和其他资源。

以下是每个配置文件中的 API 包集合的初步草案。目前,我们将这些配置文件命名为 compact1compact2compact3

compact1                     compact2                    compact3
-------------------------- ----------------------- --------------------------
java.io java.rmi java.lang.instrument
java.lang.annotation java.rmi.activation java.lang.management
java.lang.invoke java.rmi.dgc java.security.acl
java.lang.ref java.rmi.registry java.util.prefs
java.lang.reflect java.rmi.server javax.annotation.processing
java.math java.sql javax.lang.model
java.net javax.rmi.ssl javax.lang.model.element
java.nio javax.sql javax.lang.model.type
java.nio.channels javax.transaction javax.lang.model.util
java.nio.channels.spi javax.transaction.xa javax.management
java.nio.charset javax.xml javax.management.loading
java.nio.charset.spi javax.xml.datatype javax.management.modelmbean
java.nio.file javax.xml.namespace javax.management.monitor
java.nio.file.attribute javax.xml.parsers javax.management.openmbean
java.nio.file.spi javax.xml.stream javax.management.relation
java.security javax.xml.stream.events javax.management.remote
java.security.cert javax.xml.stream.util javax.management.remote.rmi
java.security.interfaces javax.xml.transform javax.management.timer
java.security.spec javax.xml.transform.dom javax.naming
java.text javax.xml.transform.sax javax.naming.directory
java.text.spi javax.xml.transform.stax javax.naming.event
java.time javax.xml.transform.stream javax.naming.ldap
java.time.chrono javax.xml.validation javax.naming.spi
java.time.format javax.xml.xpath javax.security.auth.kerberos
java.time.temporal org.w3c.dom javax.security.sasl
java.time.zone org.w3c.dom.bootstrap javax.sql.rowset
java.util org.w3c.dom.events javax.sql.rowset.serial
java.util.concurrent org.w3c.dom.ls javax.sql.rowset.spi
java.util.concurrent.atomic org.xml.sax javax.tools
java.util.concurrent.locks org.xml.sax.ext javax.xml.crypto
java.util.function org.xml.sax.helpers javax.xml.crypto.dom
java.util.jar javax.xml.crypto.dsig
java.util.logging javax.xml.crypto.dsig.dom
java.util.regex javax.xml.crypto.dsig.keyinfo
java.util.spi javax.xml.crypto.dsig.spec
java.util.stream org.ieft.jgss
java.util.zip
javax.crypto
javax.crypto.interfaces
javax.crypto.spec
javax.net
javax.net.ssl
javax.script
javax.security.auth
javax.security.auth.callback
javax.security.auth.login
javax.security.auth.spi
javax.security.auth.x500
javax.security.cert

在一些极少数的情况下,可能有必要通过移除方法来对类进行子集化,例如java.util.logging.LogManager 定义的 addPropertyChangeListenerremovePropertyChangeListener 方法,以避免拆分包或引用不存在的类型。

JMX 和 JMX Remote API 被提议用于 compact3。可能需要更新 JMX API,以避免引用 java.beans 中不存在的类型。对于 JMX Remote API,可能需要降低对 RMI-IIOP 协议的支持,以避免需要包含 CORBA。

任何现有包如果不包含在这些配置文件之一中,则仅在完整的 JRE 中可用。

可选组件

为了将配置文件的大小保持在最小,一些非 API 功能将被定义为可选。这包括但不限于:

  • 安全提供者 --- compact1 配置文件将包含一组最小的安全提供者。这一最小提供者集合将根据最流行和最常使用的算法来选择。所有未包含在 compact1 中的提供者都将被定义为可选,并且不要求包含在任何发行版中。
  • 特定国家/地区的本地化资源 --- 所有非美国的本地化资源将被定义为可选。所有可选的本地化资源将以易于开发者添加到任何 JRE 的形式进行打包和分组。

识别运行中的 JRE 实现的配置文件

java -version 选项将得到增强,以报告相关 JRE 实现的平台版本。

位于镜像顶级目录的 release 文件也将更新,以包含一个属性来指示所实现的配置文件。

此时,我们不打算添加 API 或 Java 属性来运行代码以指示所实现的配置文件。

工具和命令的增强

  • javac --- 将定义一个新的命令行选项,用于指定目标配置文件。如果编译的源代码引用了该配置文件之外的 API,将会在编译时产生错误。
  • javadoc --- 平台 API 规范需要标明哪些 API 类属于哪些配置文件。javadoc 工具将得到增强以显示此信息。
  • jdeps --- 此工具将更新一个命令行选项,用于显示包含某个包或类所需的最低配置文件。

构建系统修改

JDK 构建系统目前可以生成完整的 Java 运行时环境(JRE)或完整的 Java 开发工具包(JDK),即完整的 JRE 加上一套开发工具。我们计划增强 JEP 138 中描述的新构建系统,以选择性地生成三个额外的 Compact 目标 JRE 映像。

替代方案

长久以来,用于静态分析类文件并移除未使用元素的工具一直被用来缩减 Java 应用程序的大小。然而,将此类工具应用于平台本身的类时却存在问题,因为任何显著的大小缩减都需要具备针对待运行应用程序的具体知识。

测试

Java SE TCK 必须进行修改,以便它可以测试任何指定 Profile 的实现。TCK 的测试代理不得要求使用 compact1 Profile 之外的任何 API。

必须检查所有回归测试和功能测试,以确定引入 Profiles 对它们产生的影响。

风险与假设

Java SE 8 中 Profiles 的定义可能会使应用程序迁移到预计在未来版本中发布的完全模块化的 Java SE 平台变得复杂。此项工作所定义的 Profiles 应该在可能的情况下,与 Project Jigsaw 中正在进行的工作保持一致。

现有的 API 可能会受到一些轻微影响,以解决现有 API 包无法干净地归属于某个配置文件的情况。

影响

  • 其他 JDK 组件:javacjavadoc,如上所述
  • 兼容性:有限:某些 API 需要进行小的规范更改
  • 用户体验:有限:工具增强
  • TCK(技术兼容性套件):显著:必须拆分 TCK 以支持 Profiles