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
任何配置都必须至少提供
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 的开发提供反馈。
任何配置都必须至少提供 