首页 > 解决方案 > 了解自定义 JRE(Java 中的模块)

问题描述

在 Java 中发布模块功能并创建自定义 JRE 之后,我的问题是自定义 JRE 理论上到底发生了什么?

我知道 JRE(Java 运行时环境)内部有 JVM(Java 虚拟机)和可以为环境(OS 和 CPU)运行 Java 字节码的库。那么,如果我们使用 Java 自定义 JRE,来宾 PC 内部实际发生了什么,JVM 在哪里?

运行 java 代码的 JRE

在 Java 8 中,我们下载 JRE,用户可以使用我们的应用程序,但是在模块功能之后,Oracle 的官方 JRE 没有发布,开发人员必须使用自定义 JRE。那么开发人员如何猜测操作系统或 CPU 架构类型(发送(添加)正确的 JRE)?我现在不使用这个功能,我正在研究它。

我的问题集中在将代码编译为 java 字节码并将其发送给没有 jre 的用户之后发生了什么,如果我的应用程序在没有 jre 的情况下无法启动并且我需要使用自定义 jre,我如何知道哪种类型的机器运行我的代码? 因为在官方 jre 中,用户下载并使用 java 应用程序,但现在开发人员需要发送可能对所有用户都不利的自定义 jre。我想如果知道使用自定义 jre(了解工作流程)在这里发生了什么可以帮助我使用它。@StephenC 的答案很有帮助,我需要更多详细信息。

标签: java

解决方案


我(仍然)不确定我是否理解您的真正要求。但是,我会根据我认为您要问的内容来回答。

我知道 JRE 在 JVM 和库中具有可以为环境(操作系统和 CPU)运行 Java 字节码的库。

那是正确的,但不完全正确。

JVM实际上是在运行的东西。当你运行java命令时你会得到它。这不是java命令本身。

因此,我们不能从字面上说 JVM 在 JRE“内部”。它是在硬件上运行的进程。

那么如果我们使用 java 自定义 JRE 来宾 PC 内部实际发生了什么,它在哪里 JVM?

本质上是一样的。自定义 JRE 包括一个运行您的应用程序的启动器(可执行文件)。当您运行该启动器时,您将获得一个运行 Java 应用程序的 JVM。

在 Java 8 中,我们可以下载 JRE,用户可以使用它来运行我们的应用程序。

正确的。

但是在模块功能之后,oracle 的官方 JRE 没有发布,开发人员必须使用自定义 JRE。

您在这里混淆了两件事:

  1. 确实,Oracle(和 OpenJDK)不提供可从 Java 9 开始下载的(常规)JRE。然而:

    • 没有什么可以阻止您……或您的用户改用 JDK 发行版。
    • 还有其他 Java 供应商/供应商继续以一种或另一种形式提供 JRE 发行版。
  2. jlink您可以使用该工具创建自定义 JRE 。

...那么开发人员如何猜测操作系统或 CPU 架构类型。

如果您要使用jlink创建自定义 JRE,则需要为您支持的每个操作系统和 CPU 架构执行此操作。

但如前所述,您仍然可以指示用户安装传统的 JRE 或 JDK,并继续使用将您的应用程序作为 JAR 文件、安装程序或...


推荐阅读