Microsoft确认并支持采用专为特定应用程序而制定的自定义 Java 运行时,而不是使用常规用途 Java 运行时。 这种 Java 部署方法可确保 Java 运行时仅包含应用程序真正需要的 Java 平台部分,从而增强了安全性、减小部署大小并提升性能,这些益处适用于基于云和服务器的 Java 应用程序以及桌面/GUI 应用程序。
传统上,Oracle/Sun Microsystems 将生成 Java 运行时环境(JRE)安装程序,该安装程序仅包含 Java 虚拟机、Java API 和 OS 和浏览器特定的集成,旨在使计算机能够运行从 Internet 下载的 Java 应用程序,或通过浏览器运行 Applets 和 Java Web Start 应用程序。
随着新式 Web 应用程序和浏览器的出现,Applets 和 Java Web Start 技术都已弃用,浏览器不再支持 Java 插件。 随着时间的推移,在计算机上预装常规用途的 Java 运行时环境的需求变得不那么显著。 使用 Java 9 时,Applet API 已弃用(见 JEP 289)和 Java 17 时,API 被标记为删除,这意味着它肯定会在将来的 Java 版本中被删除。
另一个重大变化是 Java 的模块化,也是从 Java 9 版本开始的(请参阅 JSR 376)。 作为此次更改的一部分,开发人员现在可以使用 JDK 中新增的名为 jlink
的命令行,生成专为满足应用需求而设计的自定义 Java 运行时。该运行时可以作为内嵌的嵌入式运行时随应用程序代码一同部署,通常作为云工作负载的容器映像的一部分,或者作为 GUI 应用程序安装程序的一部分。
今天,Minecraft:Java Edition 部署到数百万 Minecraft 玩家,其中包含嵌入在游戏中的自定义 Java 运行时。 在联机服务(如 LinkedIn、Yammer、必应和 Azure)背后,Microsoft 还使用此技术部署了数十万个 JVM。
创建自定义 Java 运行时
若要创建 Java 运行时,必须在环境中安装 JDK 9 或更高版本。 首先下载并安装 openJDK 的Microsoft版本。
使用 jdeps
标识所需的模块
Java 平台现已细分为模块。 有关完整 列表,请参阅 Java 17 的文档 ;其他版本的 Java 可能包含新模块。
JDK 工具 jdeps
可用于分析 .class
文件、目录或 JAR
文件,以识别 Java 模块依赖项、JDK 内部依赖项和其他有用的信息,以帮助开发人员生成 Java 运行时。
$ cat HelloWorld.java
public class HelloWorld {
public static void main(String args[]) {
System.out.println("Hello World!");
}
}
$ jdeps HelloWorld.class
HelloWorld.class -> java.base
<unnamed> -> java.io java.base
<unnamed> -> java.lang java.base
该工具jdeps
表明此类仅依赖于java.lang
和java.io
包中的类型,因此它只需要模块java.base
。 当 JAR
文件作为输入时,将生成类似的输出。 使用所需模块的列表,现在可以创建 Java 运行时。
创建带有jlink
的 Java 运行时
若要从 JDK 创建 Java 运行时,必须知道所需的模块。 使用 jdeps
标识它们。 有关命令行工具的详细信息 jlink
,请参阅 文档。
示例:
$ jlink \
--add-modules java.base \
--strip-debug \
--no-man-pages \
--no-header-files \
--compress=2 \
--output /javaruntime
现在可以使用位于的 /javaruntime
Java 运行时来执行依赖于 java.base
模块的应用程序代码。 生成的文件夹的结构javaruntime
类似于 JDK 目录结构,用于jlink
启动 JVM 的命令行工具与往常一样位于java
./bin/
文件夹中。 如果自定义 Java 运行时包含现有应用程序的所有必需模块,则可以由 JAVA_HOME
引用。
$ /javaruntime/bin/java HelloWorld
Hello, World!
在上面的示例中,Windows 上生成的 Java 运行时在 Windows 上使用大约 24 MB。
使用 Docker 容器映像创建 Java 运行时
可以使用 Docker 多阶段生成 在映像生成过程中创建、使用和打包自定义 Java 运行时。 了解如何 使用 Docker 创建 Java 运行时。
知识库
javax.net.ssl.SSLHandshakeException:收到致命警报:握手失败
有关如何解决此问题的说明,请访问 Java 安全和加密 。
资源
提供有关 Microsoft Build of OpenJDK 的反馈
向我们发送你的评论、想法和意见,帮助我们改进 Microsoft Build of OpenJDK。 请访问 GitHub 上的 OpenJDK 讨论页面 ,向我们发送反馈。
Java 和 OpenJDK 是 Oracle 及其关联公司的商标或注册商标。