Java ME CDC 到 Java SE Embedded 8 迁移指南
简介
Java ME CDC 技术是 Oracle 针对拥有超过 1MB RAM 和 10MB ROM 的嵌入式设备的原有技术。Java SE Embedded 8 是新一代 Java Embedded 平台,针对拥有大致相同数量资源的设备,同时还允许它们访问新的 API 和功能。本文帮助原有的 Java ME CDC 开发人员将其 CDC 应用迁移到 Java SE Embedded 8。
Java SE Embedded 8 的实现有多种类型,包括 Linux/ARM 和 Linux/PowerPC 端口,即众多开发人员使用 Java ME CDC 的的平台类型相同。除了相同类型的端口之外,Java SE Embedded 8 还提供了完整的 Java SE 8 语言和 API 集。
而且,还有 JDK 8 紧凑 Profile 这个新特性。紧凑 Profile 所允许的 Java SE 运行时大小在 11MB 到 50MB 的范围内,具体取决于 CDC 应用 API 的要求。为了解决 CDC 开发人员过去所面临的对大小的顾虑,还有其他大小缩减,如内存优化、缩小 Java 虚拟机、减小 Java SE Embedded 8 中的类大小。
紧凑 Profile
紧凑 Profile 是 Java SE Embedded 8 的新 API 子集。这个新特性的主要目的是让不需要整个 Java SE Platform 的应用能够在资源受限设备上运行,就像允许使用 CDC 平台进行 Java ME CDC 开发一样。不使用 Swing/AWT/2D 图形堆栈的应用(例如,改用 Java FX 的应用)可以通过在不包含这些 API 的紧凑 Profile 之上运行来节省大量空间,就像在无头 Java ME CDC/Foundation Profile 堆栈上运行的无头 CDC 应用一样。
更广泛地说,紧凑 Profile 特性旨在让当前基于 Java ME 连接设备配置 (CDC) 构建的应用能够迁移到相应的 Java SE Platform 的紧凑Profile 中,这是长期以来为融合 CDC 与 Java SE 所做的努力之一。
紧凑 Profile 1:Java ME CDC/Foundation Profile 的等效物
第一种紧凑 Profile(称为 compact1 运行时)的典型大小约为 11MB,与 CDC 平台类似。因此,只需 compact1 中大致相同的静态空间占用大小,就可以得到与 Java ME CDC 相当的、功能非常强大的运行时环境。典型 Java ME CDC 程序员应发现 compact1 中的特定软件包是他们所熟悉的,而且可能乐于见到其中增加了 Annotation、Concurrent、Pref、Script、Time 和 NIO,这是 CDC 和 Foundation Profile 规范所不具备的。
图 1:compact1 软件包名称
还有其他一些值得一提的 Java SE Embedded 8 新特性,这些特性是 CDC 规范所不具备的,是继 Java ME CDC 之后 Java SE 体系中的新进展。其中包括 Hotspot VM 的新特性,Hotspot VM 这个 Java 虚拟机针对嵌入式设备进行了优化和调优,同时还提供 Java SE 技术的功能:
- 客户端VM:针对多核 CPU 和并发支持进行了并行化
- 分代垃圾回收:快速、小型的特殊垃圾回收
- 分层编译:特殊的即时编译方式,可以节省空间、加快编译速度
而且,还有以下新安全特性,优于过去 CDC 所提供的安全特性:
- 更现代化、更安全的新加密算法:TLS 1.2、Elliptical Curve、RSA 等
- 新的 JCE 框架
- 新的、更快的硬件加速加密支持 (PKCS11)
- 新的和更新的一组根证书 (cacert)
构建紧凑 Profile 1 环境
为了构建 compact1 平台,需要从 Java SE Embedded 8 JDK 开始,使用新的 jrecreate 工具新建一个紧凑 profile。以这种方式使用 jrecreate.sh 脚本来完成:
% sh jrecreate.sh -d /home/myjres/smallest-jre --vm minimal --profile compact1
创建 compact1 profile 环境之后,您就有了一个可以在设备上使用的 Java SE Embedded 运行时,它占用空间小,但包含了紧凑 Profile 1 定义的 Java SE 8 子集中的全部 API。如果您想自定义 compact1 profile 环境中的 Java VM 类型,可以使用 -vm 标志将其从“minimal”(即最小 VM 设置)更改为“client”或“server”。
例如,以下 jrecreate 工具命令将创建一个包含“server”Java 虚拟机的完整的 JRE Profile。
% sh jrecreate.sh -d /home/myjre/full-jre --vm server
针对紧凑 Profile 1 编译现有 CDC 应用
有了 compact1 profile(等同于 CDC)之后,现在准备编译现有的 CDC 应用源文件,让其使用 compact1 profile 运行时运行。为此,您可以使用新的 javac -profile <compact#> 标志选项。
因此,举例来说,如果您有一个针对 CDC 编写的 HelloWorld.java 应用,可以使用新的 Java SE Embedded 8 javac 用新的“-profile compact1”标志编译,将 CDC 应用编译到 Java SE Embedded 8 的 compact1 运行时:
$ javac -profile compact1 HelloWorld.java
如果您的应用源文件尝试使用旧版 CDC/Foundation Profile 规范之外的 API 或新的紧凑 Profile 1 规范之外的 API(例如,使用不在任何紧凑 Profile 中的 ThreadMXBean 类),尝试使用“-profile compact1”标志编译时会看到以下错误:
$ javac -profile compact1 ThreadMXBeanTest.java
Test.java:7: error:ThreadMXBean is not available in profile 'compact1'
ThreadMXBean bean = ManagementFactory.getThreadMXBean();
^
Test.java:7: error:ManagementFactory is not available in profile 'compact1'
ThreadMXBean bean = ManagementFactory.getThreadMXBean();
^
2 errors
因此,要想在较小的环境内运行,如果您未遵循 -profile 文件的子集化规范,就能会看到如上所示的 API“not available in profile 'compact1'”的错误消息。
执行 CDC 应用
要执行应用,不要使用“cvm”命令行 Java VM 调用来调用,而是使用带有相同参数的 Java SE“java”调用:
# Java ME CDC
% cvm -cp .HelloWorld
# Or
% cvm -jar HelloWorld.jar
结果将是:
# Java SE 8 Embedded Using Compact Profiles
% java -cp .HelloWorld
# Or
% java -jar HelloWorld.jar
只需用“java”替代“cvm”,因此这个迁移步骤非常简单。
总结
总之,您可以看到,将 Java ME CDC 应用迁移到 Java SE Embedded 8 非常简单,可以利用 Java SE 8 新的更小的紧凑 Profile,并且可以使用新的 jrecreate 工具进行自定义。而且,Java SE Embedded 8 中还有反映 Java SE 平台新进展的更多、更好的 API 可供选择。
有关更多信息,请参见 Java SE Embedded 8 网页:http://www.oracle.com/technetwork/cn/java/embedded/embedded-se/overview/index.html