Java SE Embedded 8 引入了一个新概念 — 紧凑 Profile,可以减少不需要整个 Java 平台的应用的内存占用量。Java SE 8 javac 编译器有一个新的 -profile 选项,可以使用一个新的支持的 profile 编译应用。
支持的 profile 有三个:compact1、compact2 和 compact3。这些是附加层,因此每个 profile 都包含以前较小的紧凑 Profile 中的全部 API,在此基础上还增加了相应的 API。紧凑 profile 特性在小型设备中很有用。使用它还可以缩短从下载服务器(如“App Store”)下载应用的时间。它有助于更紧凑地部署捆绑 JRE 的 Java 应用。可以使用紧凑 profile 配置 JRE,减小其空间占用,以便与 profile 应用一起部署。
紧凑 Profile 是完整 Java SE 平台 API 的一个子集。由于紧凑 Profile 所需的存储空间更小,所以可以让许多 Java 应用在资源受限设备上运行。选择非常符合应用的功能需求的紧凑 profile 可以尽量减少专用于未使用功能的存储。Java SE Embedded 8 中新增的嵌入式开发人员工具包括 jrecreate 和 jdeps,开发人员可以使用这些工具针对某一平台定制紧凑 Profile 运行时环境,查明紧凑 Profile 的依赖关系,以便在平台开发过程中进行分析。
紧凑 Profile 只解决 API 选择问题;它们与 Java 虚拟机、语言本身或工具无关。因此,必须小心地将 Java 虚拟机支持的功能与所需的 API 支持匹配。
有三个 profile:compact1、compact2 和 compact3。每个 profile 都包含低编号 profile 的 API(compact2 是 compact1 的超集)。完整 SE API 是 compact3 profile 的超集。下表显示每个 profile 的高级组成:
完整 SE API | Bean | 输入法 | IDL |
首选项 | 辅助功能 | 打印服务 | |
RMI-IIOP | CORBA | Java 2D | |
声音 | Swing | ||
AWT | 拖放 | ||
图像 I/O | JAX-WS | ||
compact3 | 安全性1 | JMX | JNDI |
XML JAXP2 | 管理 | 插装 | |
compact2 | JDBC | RMI | XML JAXP |
compact1 | 核心 (java.lang.* ) | 安全性 | 序列化 |
网络 | 引用对象 | 正则表达式 | |
日期和时间 | 输入/输出 | 集合 | |
日志记录 | 并发性 | 反射 | |
JAR | ZIP | 版本控制 | |
国际化 | JNI | 覆盖机制 | |
扩展机制 | 脚本编写 |
1.compact1 安全性中新增了 kerberos、acl 和 sasl。
2.compact2 XML JAXP 中新增了 crypto。
这些 JDK 8 工具显式支持 profile:
-profile
profile 选项指示编译器标记使用了 profile 中不存在的 API。jdeps
静态依赖关系分析器 [Solaris、Linux 或 Mac OS X 或 Windows]:-profile
选项显示包含软件包的 profile 或文件。下表列出每个紧凑 profile 中的 API 软件包。API 参考还定义了 profile 组成。
compact1 | compact2 新增项 | compact3 新增项 |
---|---|---|
java.io | java.rmi | java.lang.instrument |
java.lang | java.rmi.activation | java.lang.management |
java.lang.annotation | java.rmi.dgc | java.security.acl |
java.lang.invoke | java.rmi.registry | java.util.prefs |
java.lang.ref | java.rmi.server | javax.annotation.processing |
java.lang.reflect | java.sql | javax.lang.model |
java.math | javax.rmi.ssl | javax.lang.model.element |
java.net | javax.sql | javax.lang.model.type |
java.nio | javax.transaction | javax.lang.model.util |
java.nio.channels | javax.transaction.xa | javax.management |
java.nio.channels.spi | javax.xml | javax.management.loading |
java.nio.charset | javax.xml.datatype | javax.management.modelmbean |
java.nio.charset.spi | javax.xml.namespace | javax.management.monitor |
java.nio.file | javax.xml.parsers | javax.management.openmbean |
java.nio.file.attribute | javax.xml.stream | javax.management.relation |
java.nio.file.spi | javax.xml.stream.events | javax.management.remote |
java.security | javax.xml.stream.util | javax.management.remote.rmi |
java.security.cert | javax.xml.transform | javax.management.timer |
java.security.interfaces | javax.xml.transform.dom | javax.naming |
java.security.spec | javax.xml.transform.sax | javax.naming.directory |
java.text | javax.xml.transform.stax | javax.naming.event |
java.text.spi | javax.xml.transform.stream | javax.naming.ldap |
java.time | javax.xml.validation | javax.naming.spi |
java.time.chrono | javax.xml.xpath | javax.security.auth.kerberos |
java.time.format | org.w3c.dom | javax.security.sasl |
java.time.temporal | org.w3c.dom.bootstrap | javax.sql.rowset |
java.time.zone | org.w3c.dom.events | javax.sql.rowset.serial |
java.util | org.w3c.dom.ls | javax.sql.rowset.spi |
java.util.concurrent | org.xml.sax | javax.tools |
java.util.concurrent.atomic | org.xml.sax.ext | javax.xml.crypto |
java.util.concurrent.locks | org.xml.sax.helpers | javax.xml.crypto.dom |
java.util.function | javax.xml.crypto.dsig | |
java.util.jar | javax.xml.crypto.dsig.dom | |
java.util.logging | javax.xml.crypto.dsig.keyinfo | |
java.util.regex | javax.xml.crypto.dsig.spec | |
java.util.spi | org.ietf.jgss | |
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 |
开发适用于紧凑 Profile 的应用时,切记只能使用 compact1、compact2 或 compact3 profile 规范中所能找到的 API。请参考上面的“profile 详细比较”,看看每个紧凑 Profile 中包含哪些 Java 软件包。为了轻松编写适用于紧凑 Profile 的嵌入式应用,您可以在编写应用之后使用“jdeps”工具查看源代码正在使用哪些 Java 软件包。观察对 Java 应用运行 jdeps 的结果,您将看到执行应用将需要哪个紧凑 Profile 运行时。
下面显示了 jdeps 工具的用法:
$ jdeps
Usage: jdeps <options> <classes...>
where <classes> can be a pathname to a .class file, a directory, a JAR file,
or a fully-qualified classname or wildcard "*". Possible options include:
-s --summary Print dependency summary only
-v --verbose Print additional information
-V <level> --verbose-level=<level> Print package-level or class-level dependencies
Valid levels are: "package" and "class"
-c <path> --classpath=<path> Specify where to find class files
-p <pkg name> --package=<pkg name> Restrict analysis to classes in this package
(may be given multiple times)
-e <regex> --regex=<regex> Restrict analysis to packages matching pattern
(-p and -e are exclusive)
-P --profile Show profile or the file containing a package
-R --recursive Recursively traverse all dependencies
--version Version information
使用 jdeps 的典型方式是使用“-P”打印您的应用正在使用的 profile,以便您查看执行该应用必须使用哪个紧凑 Profile。
例如,下面是一个典型的 jdeps 运行,可以查明要哪个紧凑 profile 是运行该程序必需的最低 profile:
% jdeps -P HelloWorld.class
HelloWorld.class -> /net/test11.us.example.com/export/java-re/jdk/8/ea/b124/binaries/linux-i586/jre/lib/rt.jar
<unnamed> (HelloWorld.class)
-> java.io compact1
-> java.lang compact1
上例中的结果显示,compact1 profile 是运行 HelloWorld 应用所需的最低 profile。因此,HelloWorld 应用必须使用 compact1 Java SE Embedded 8 运行时运行。
更多信息
为方便起见,下载包中包括 Java SE for Embedded 的技术文档。
还可以在线访问 Java SE Embedded 文档:
Java SE Embedded 文档