java - 了解自定义 JRE(Java 中的模块)
问题描述
在 Java 中发布模块功能并创建自定义 JRE 之后,我的问题是自定义 JRE 理论上到底发生了什么?
我知道 JRE(Java 运行时环境)内部有 JVM(Java 虚拟机)和可以为环境(OS 和 CPU)运行 Java 字节码的库。那么,如果我们使用 Java 自定义 JRE,来宾 PC 内部实际发生了什么,JVM 在哪里?
在 Java 8 中,我们下载 JRE,用户可以使用我们的应用程序,但是在模块功能之后,Oracle 的官方 JRE 没有发布,开发人员必须使用自定义 JRE。那么开发人员如何猜测操作系统或 CPU 架构类型(发送(添加)正确的 JRE)?我现在不使用这个功能,我正在研究它。
我的问题集中在将代码编译为 java 字节码并将其发送给没有 jre 的用户之后发生了什么,如果我的应用程序在没有 jre 的情况下无法启动并且我需要使用自定义 jre,我如何知道哪种类型的机器运行我的代码? 因为在官方 jre 中,用户下载并使用 java 应用程序,但现在开发人员需要发送可能对所有用户都不利的自定义 jre。我想如果知道使用自定义 jre(了解工作流程)在这里发生了什么可以帮助我使用它。@StephenC 的答案很有帮助,我需要更多详细信息。
解决方案
我(仍然)不确定我是否理解您的真正要求。但是,我会根据我认为您要问的内容来回答。
我知道 JRE 在 JVM 和库中具有可以为环境(操作系统和 CPU)运行 Java 字节码的库。
那是正确的,但不完全正确。
JVM实际上是在运行的东西。当你运行java
命令时你会得到它。这不是java
命令本身。
因此,我们不能从字面上说 JVM 在 JRE“内部”。它是在硬件上运行的进程。
那么如果我们使用 java 自定义 JRE 来宾 PC 内部实际发生了什么,它在哪里 JVM?
本质上是一样的。自定义 JRE 包括一个运行您的应用程序的启动器(可执行文件)。当您运行该启动器时,您将获得一个运行 Java 应用程序的 JVM。
在 Java 8 中,我们可以下载 JRE,用户可以使用它来运行我们的应用程序。
正确的。
但是在模块功能之后,oracle 的官方 JRE 没有发布,开发人员必须使用自定义 JRE。
您在这里混淆了两件事:
确实,Oracle(和 OpenJDK)不提供可从 Java 9 开始下载的(常规)JRE。然而:
- 没有什么可以阻止您……或您的用户改用 JDK 发行版。
- 还有其他 Java 供应商/供应商继续以一种或另一种形式提供 JRE 发行版。
jlink
您可以使用该工具创建自定义 JRE 。
...那么开发人员如何猜测操作系统或 CPU 架构类型。
如果您要使用jlink
创建自定义 JRE,则需要为您支持的每个操作系统和 CPU 架构执行此操作。
但如前所述,您仍然可以指示用户安装传统的 JRE 或 JDK,并继续使用将您的应用程序作为 JAR 文件、安装程序或...
推荐阅读
- linux - “ls -A”选项在 linux 中有什么作用?
- javascript - Javascript 正则表达式以任何顺序匹配特定单词的列表
- r - 如何在测试结果的相对频率分布中制作堆叠图?
- sql - 调用程序的锁定问题
- python - 继续两个嵌套循环?
- android - Admob 原生广告拦截来自 Fragment 的触摸事件
- java - @WebMVC 无法加载 ApplicationContext
- python - 将变量添加到链接名称/将变量添加到参数
- java - 是否可以避免将相同的元素打印到数组中
- azure-virtual-network - 无法使用python获取天蓝色的子网ID