13.3 Java 8配置

Java 8 原本的路线图包括 Jigsaw 项目,这是一个全面的模块化方案,既会模块化平台本身,也会移除单个巨大的 rt.jar 文件。

可是,由于 Java 8 发布周期的限制,这项任务在计划的发布日期之前无法完成。项目的开发团队没有选择推迟发布 Java 8,而是把平台的模块化延后到 Java 9。

13.3.1 目的

Java 8 虽然没有完全模块化,但引入了配置(Profile)的概念。配置的作用是创建简化版 Java SE,所有配置都必须满足下述条件。

  • 必须完全实现 JVM 规范。

  • 必须完全实现 Java 语言规范。

  • 配置由一系列包组成。通常情况下,配置中的包要和完整版 Java SE 中的包使用相同的名称,而且任何异常(极少出现)都要显式呼出。

  • 一个配置可以声明它比另一个配置大。此时,这个配置必须是另一个配置的严格超集。

根据第二个条件,所有配置都必须包含 Java 语言规范中明确提到的全部类和包。

配置的主要目的是减小 rt.jar。这对功能少的平台是有用的,因为这些平台用不到 Java SE 的全部功能(例如图形化工具集 Swing 和 AWT)。

从这个角度来看,可以说配置让 Java ME 平台向前发展了,而且能和 Java SE 和谐相处(甚至统一)。不过,配置也可以理解为服务器应用或其他环境的基础,在这些环境中无需部署不必要的功能。

最后还有一点值得注意,最近几年发现的 Java 安全漏洞大多数都与 Swing 和 AWT 中实现的图形化客户端功能有关。如果不部署实现这些功能的包,就能适当提高服务器应用的安全性。

下面分别介绍 Java 8 提供的三个标准配置(紧凑配置,Compact Profiles)。

13.3.2 紧凑配置

紧凑配置 1 中的包数量最少,但已经足够满足部署应用。包含的包如下:

  • java.io

  • java.lang

  • java.lang.annotation

  • java.lang.invoke

  • java.lang.ref

  • java.lang.reflect

  • java.math

  • java.net

  • java.nio

  • java.nio.channels

  • java.nio.channels.spi

  • java.nio.charset

  • java.nio.charset.spi

  • java.nio.file

  • java.nio.file.attribute

  • java.nio.file.spi

  • java.security

  • java.security.cert

  • java.security.interfaces

  • java.security.spec

  • java.text

  • java.text.spi

  • java.time

  • java.time.chrono

  • java.time.format

  • java.time.temporal

  • java.time.zone

  • java.util

  • java.util.concurrent

  • java.util.concurrent.atomic

  • java.util.concurrent.locks

  • java.util.function

  • java.util.jar

  • java.util.logging

  • java.util.regex

  • java.util.spi

  • java.util.stream

  • 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

13.3 Java 8配置 - 图1 任何配置都必须至少提供 Object 类引用的传递闭包类型,这一点很重要,一定要知道。图 11-1 显示了 Object 类的部分转递闭包,而紧凑配置 1 是最接近这个最小引导集的配置。

紧凑配置 2 包含紧凑配置 1 中的所有包,除此之外还包含下述包:

  • java.rmi

  • java.rmi.activation

  • java.rmi.dgc

  • java.rmi.registry

  • java.rmi.server

  • java.sql

  • javax.rmi.ssl

  • javax.sql

  • javax.transaction

  • javax.transaction.xa

  • javax.xml

  • javax.xml.datatype

  • javax.xml.namespace

  • javax.xml.parsers

  • javax.xml.stream

  • javax.xml.stream.events

  • javax.xml.stream.util

  • javax.xml.transform

  • javax.xml.transform.dom

  • javax.xml.transform.sax

  • javax.xml.transform.stax

  • javax.xml.transform.stream

  • javax.xml.validation

  • javax.xml.xpath

  • org.w3c.dom

  • org.w3c.dom.bootstrap

  • org.w3c.dom.events

  • org.w3c.dom.ls

  • org.xml.sax

  • org.xml.sax.ext

  • org.xml.sax.helpers

  • javax.xml.crypto.dsig

  • javax.xml.crypto.dsig.dom

  • javax.xml.crypto.dsig.keyinfo

  • javax.xml.crypto.dsig.spec

  • org.ietf.jgss

紧凑配置 3 是 Java 8 提供的最全面的配置,包含紧凑配置 2 中的所有包,除此之外还包含下述包:

  • java.lang.instrument

  • java.lang.management

  • java.security.acl

  • java.util.prefs

  • javax.annotation.processing

  • javax.lang.model

  • javax.lang.model.element

  • javax.lang.model.type

  • javax.lang.model.util

  • javax.management

  • javax.management.loading

  • javax.management.modelmbean

  • javax.management.monitor

  • javax.management.openmbean

  • javax.management.relation

  • javax.management.remote

  • javax.management.remote.rmi

  • javax.management.timer

  • javax.naming

  • javax.naming.directory

  • javax.naming.event

  • javax.naming.ldap

  • javax.naming.spi

  • javax.security.auth.kerberos

  • javax.security.sasl

  • javax.sql.rowset

  • javax.sql.rowset.serial

  • javax.sql.rowset.spi

  • javax.tools

  • javax.xml.crypto

  • javax.xml.crypto.dom

配置虽然不是我们可能盼望的彻底模块化方案,但是却向未来的目标迈出了重要的一步——对严格要求兼容性的设备和服务器端开发者来说都是如此。

在 Java 8 中积极部署配置,有助于引起模块化话题,并为 Java 9 的开发提供反馈。