跳到主要内容

JEP 161:紧凑配置

概括

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

目标

  1. 自行定义配置文件。

  2. 定义一些方法来在运行时识别当前的Profile。

  3. 确保结果是可测试的,以便可以针对每个配置文件的实现运行适当的一致性和质量测试。

  4. 增强现有的 JDK 工具以支持创建可以在特定配置文件上运行的应用程序。

  5. 尽可能考虑未来过渡到基于模块系统的更灵活的方法。

非目标

定义模块系统不是本提案的目标。

动机

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

更广泛地说,此功能旨在支持将当前构建在 Java ME连接设备配置 (CDC)之上的应用程序迁移到适当的 Java SE 平台配置文件,这是将 CDC 与 Java SE 融合的长期努力的一部分。

作为次要好处,此功能可能会加快捆绑其自己的 Java 运行时环境 (JRE) 的应用程序的下载时间。

描述

我们目前设想定义三个配置文件,排列在附加层中,以便每个配置文件包含比其自身小的配置文件中的所有 API。每个Profile都会指定一组特定的Java API包;在可行的情况下,相应的 JRE 将仅包括支持这些 API 所需的类、本机代码和其他资源。

以下是每个配置文件中 API 包集的初始草案。目前,我们将配置文件命名为compact1、compact2 和compact3。

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 定义的 addPropertyChangeListener 和 removePropertyChangeListener 方法)来对类进行子集化,以避免拆分包或引用不存在的类型。

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 属性来运行代码来指示已实现的 Profile。

工具和命令的增强

  • 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。

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

风险和假设

Java SE 8 中配置文件的定义可能会使应用程序向未来版本中预期的完全模块化 Java SE 平台的迁移变得复杂。这项工作定义的概要文件应尽可能与Project Jigsaw中正在进行的工作保持一致。

可能会对现有 API 产生一些轻微影响,以解决现有 API 包未完全归入一个配置文件或另一个配置文件的情况。

影响

  • 其他 JDK 组件:javacjavadoc、如上所述
  • 兼容性:有限:某些 API 需要进行较小的规格更改
  • 用户体验:有限:工具增强
  • TCK:重要:TCK 必须拆分以支持配置文件