使用 jlink 的 Java 运行时

Microsoft 承认并支持采用针对特定应用程序需求构建的自定义 Java 运行时,而不是使用通用 Java 运行时。 这种 Java 部署方法可确保 Java 运行时仅包含应用程序真正需要的 Java 平台部分,从而为基于云和服务器的 Java 应用程序以及桌面/GUI 应用程序提高安全性、减小部署大小并增强性能。

通常,Oracle/Sun Microsystems 将生成 Java Runtime Environment (JRE) 安装程序,这些安装程序仅包含 Java 虚拟机、Java API 以及特定于 OS 和浏览器的集成,旨在使计算机能够运行从 Internet 下载的 Java 应用程序,或通过浏览器运行小程序和 Java Web Start 应用程序。

随着新式 Web 应用程序和浏览器的出现,小应用程序和 Java Web Start 技术都已弃用,浏览器不再支持 Java 插件。 随着时间的推移,不再那么需要在计算机上预安装通用 Java Runtime Environment。 在 Java 9 中,Applet API 已弃用(请参阅 JEP 289),而在 Java 17 中,该 API 已标记为删除,这意味着它肯定会在将来的 Java 版本中被删除。

另一重大变更是 Java 的模块化,也是从 Java 9 版本开始的(请参阅 JSR 376)。 通过此更改,开发人员现可以在 JDK 中使用新添加的名为 jlink 的命令行来生成专为满足应用程序需求而设计的自定义 Java 运行时,将其部署为内置嵌入式运行时以及应用程序代码,通常作为基于云的工作负载的容器映像的一部分,或作为基于 GUI 的应用程序安装程序的一部分。

如今,Java 版我的世界已为数百万我的世界游戏玩家部署,并在游戏中嵌入了自定义 Java 运行时。 在 LinkedIn、Yammer、必应和 Azure 等联机服务的背后,Microsoft 还使用此方法部署了数十万个 JVM。

创建自定义 Java 运行时

若要创建 Java 运行时,必须在环境中安装 JDK 9 或更高版本。 首先下载安装 Microsoft Build of OpenJDK。

使用 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.langjava.io 包中的类型,因此它只需要模块 java.base。 将为 JAR 文件生成类似的输出作为输入。 有了所需模块的列表,现在可以创建 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 模块的应用程序代码。 jlink 生成的 javaruntime 文件夹的结构类似于 JDK 目录结构,启动 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: 收到严重警报: handshake_failure

有关如何解决此问题的说明,请访问 Java 安全性和加密

资源

提供有关 Microsoft Build of OpenJDK 的反馈

向我们发送你的评论、想法和意见,帮助我们改进 Microsoft Build of OpenJDK。 请访问 GitHub 上的 OpenJDK 讨论页面,向我们发送反馈。

Java 和 OpenJDK 是 Oracle 和/或其附属机构的商标或注册商标。