Skip to content

JEP 161: Compact Profiles | 紧凑配置文件

摘要

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

目标

  1. 定义这些 Profile 本身。
  2. 定义一些手段,在运行时能够识别当前的 Profile。
  3. 确保结果是可测试的,以便对每个 Profile 的实现运行适当的一致性和质量测试。
  4. 增强现有的 JDK 工具,支持创建能够在特定 Profile 上运行的应用程序。
  5. 尽可能考虑未来转向基于模块系统的更灵活的方法。

非目标

此提案的目标不是定义一个模块系统。

动机

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

更广泛地说,这个功能旨在使当前构建在 Java ME(Connected Device Configuration (CDC))之上的应用程序能够迁移到 Java SE 平台的适当 Profile 上,这是长期努力的一部分,旨在将 CDC 与 Java SE 合并。

作为一个次要的好处,这个功能很可能会缩短捆绑自己的 Java Runtime Environment(JRE)的应用程序的下载时间。

描述

我们目前设想定义三个 Profile,按照递增的层次布置,使得每个 Profile 包含比它自己小的所有 Profile 中的 API。每个 Profile 将指定一组特定的 Java API 包;相应的 JRE 将尽可能地只包括支持这些 API 所需的类、本地代码和其他资源。

下面是每个 Profile 中 API 包集的初始草案。暂时我们将这些 Profile 命名为 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 定义的 addPropertyChangeListenerremovePropertyChangeListener 方法,以避免拆分包或引用不存在的类型。

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

任何不包含在这些 Profiles 中的现有包将仅在完整的 JRE 中可用。

可选组件

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

  • 安全提供商 --- compact1 Profile 将包含一个最小的安全提供商集合。将基于最流行和经常使用的算法选择最小集合的提供商。所有未包括在 compact1 中的提供商将被定义为可选项,并不需要将其包含在任何发行版中。
  • 特定国家/地区的本地化资源 --- 所有非美国的本地化资源将被定义为可选项。所有可选的本地化资源将以便于开发人员通过打包和分组的方式轻松地添加到任何 JRE 中。

识别正在运行的 JRE 实现的 Profile

java -version 选项将被增强以报告所涉及 JRE 实现的 Profile。

位于镜像顶层目录的 release 文件也将被更新以包含一个属性来指示实现的 Profile。

目前,我们不认为有必要为运行代码添加 API 或 Java Property 来指示实现的 Profile。

对工具和命令的增强

  • javac --- 将定义一个新的命令行选项来指定目标 Profile。如果正在编译的源代码引用了该 Profile 之外的 API,则会在编译时出现错误。
  • javadoc --- 平台 API 规范需要标识哪些 API 类属于哪个 Profile。javadoc 工具将被增强以显示这些信息。
  • jdeps --- 将使用一个命令行选项更新此工具,以显示一个包或类所属的最小 Profile。

构建系统修改

JDK 构建系统目前可以生成完整的 Java Runtime Environment (JRE) 或完整的 Java Development Kit (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 包不清楚地归入一个 Profile 或另一个 Profile 的情况。

影响

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