为什么openjdk中只包含了jre_AdoptOpenJDK的JRE 11+是否与在JDK上使用jlink相同,是否添加了所有依赖项 - java...

博客探讨了AdoptOpenJDK的JRE 11+是否与仅使用jlink并添加所有依赖项相同。通过对比下载Adopt的JRE、用jlink构建映像以及要求jlink绑定服务的模块列表,推测Adopt的JRE是用特定模块列表构建的,还提及Java代码相关问题及参考方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AdoptOpenJDK的JRE 11+是否与仅使用jlink并添加所有依赖项相同?

Oracle Java 11及更高版本不只包含JRE JDK,因为您可以使用,jlink构建仅包含所需系统模块的JRE,这就是我在Windows和Linux上所做的。

但是,对于如何在某些平台(Docker和MacOS)上结合Jlinked JRE而言,这对我来说并不那么明显,而且由于AdoptOpenJDK不仅为JDK提供了二进制文件,还为JRE提供了二进制文件,所以我想我可以将JRE用于这些平台。 但是,如果将JDK链接到JDK并包含所有系统模块依赖项,JRE是否包含所有内容?

参考方案

如果您下载Adopt的JRE并运行java --list-modules,则会得到以下内容(为了更好的可读性,我删除了该版本):

java.base

java.compiler

java.datatransfer

java.desktop

java.instrument

java.logging

java.management

java.management.rmi

java.naming

java.net.http

java.prefs

java.rmi

java.scripting

java.se

java.security.jgss

java.security.sasl

java.smartcardio

java.sql

java.sql.rowset

java.transaction.xa

java.xml

java.xml.crypto

jdk.accessibility

jdk.aot

jdk.charsets

jdk.crypto.cryptoki

jdk.crypto.ec

jdk.dynalink

jdk.httpserver

jdk.internal.ed

jdk.internal.le

jdk.internal.vm.ci

jdk.internal.vm.compiler

jdk.internal.vm.compiler.management

jdk.jdwp.agent

jdk.jfr

jdk.jsobject

jdk.localedata

jdk.management

jdk.management.agent

jdk.management.jfr

jdk.naming.dns

jdk.naming.rmi

jdk.net

jdk.pack

jdk.scripting.nashorn

jdk.scripting.nashorn.shell

jdk.sctp

jdk.security.auth

jdk.security.jgss

jdk.unsupported

jdk.xml.dom

jdk.zipfs

如果下载JDK并使用jlink --add-modules java.se构建映像,则会得到以下信息:

java.base

java.compiler

java.datatransfer

java.desktop

java.instrument

java.logging

java.management

java.management.rmi

java.naming

java.net.http

java.prefs

java.rmi

java.scripting

java.se

java.security.jgss

java.security.sasl

java.sql

java.sql.rowset

java.transaction.xa

java.xml

java.xml.crypto

如您所见,它不包含jdk。*模块,因为严格来讲,运行时不需要这些模块。仍然会注意到他们的缺席,例如如果没有jdk.localedata,则只有英语语言环境(甚至可能只有美国)会起作用。

如果您要求jlink绑定服务,您将获得不同的画面,但与JRE有所不同:

java.base

java.compiler

java.datatransfer

java.desktop

java.instrument

java.logging

java.management

java.management.rmi

java.naming

java.net.http

java.prefs

java.rmi

java.scripting

java.se

java.security.jgss

java.security.sasl

java.smartcardio

java.sql

java.sql.rowset

java.transaction.xa

java.xml

java.xml.crypto

jdk.charsets

jdk.compiler

jdk.crypto.cryptoki

jdk.crypto.ec

jdk.dynalink

jdk.internal.opt

jdk.jartool

jdk.javadoc

jdk.jdeps

jdk.jfr

jdk.jlink

jdk.localedata

jdk.management

jdk.management.jfr

jdk.naming.dns

jdk.naming.rmi

jdk.scripting.nashorn

jdk.security.auth

jdk.security.jgss

jdk.unsupported.desktop

jdk.zipfs

存在,例如jdk.compiler和jdk.javadoc意味着bin目录将包含javac和javadoc工具,可能不是您希望从JRE获得的工具。

这告诉我Adopt的JRE是使用特定模块列表构建的。如果掌握了该模块列表,或者只是使用上面的列表来构建运行时映像,则应该获得与从AdoptOpenJDK下载的JRE完全相同的行为。

请注意以下几点:(a)这只是我的假设,所以不要在上面押注您的项目;(b)您可以将许多标志应用于jlink来修饰生成的图像,例如压缩或剥离调试符号,这将(略微)影响其大小,性能和调试能力。

在Java中,执行“ ++++++++”表达式,编译器未报告任何错误并且可以正确执行? - java

我用eclipse编写了这段代码,用war写过,结果为3d。public static void main(String[] args) { double a = 5d + + + + + +-+3d; System.out.println(a); } 参考方案 您的表情可以改写为(5d) + (+ + + + +-+3d) 其中第一个+是应用于两个操作数的…Java和C++共享内存 - java

我有一段创建共享内存的C++代码。是否可以编写Java代码来读取C++代码创建的内存,除非使用JNI。顺便说一句,我正在使用Windows操作系统。 参考方案 请参见MappedByteBuffer。这是读写共享内存的标准Java类。我经常使用。是的,您可以使用它与使用共享内存以任何语言编写的任何程序进行通信,并且这都是非常标准的Java,没有JNI。Java值加变量++ - java

考虑以下代码int val1 = 3; val1++; int val2 = val1++; System.out.println(val1); System.out.println(val2); Val1值= 5;Val2值= 4;为什么Val1的值是“ 5”?据我了解,应该为4,因为:在第1行,它的赋值为3,在第2行,通过val1 ++加上1,结果val…我可以使用JNI在Java代码中引用C++对象吗? - java

我在任何地方都没有看到(或者也许我很简单,没有看到它),但是有没有办法使用JNI返回c / c ++对象并在Java中使用该对象?例如(非常简单):class simpleClass{ ... private: int intVar; public: int getIntVar(); void setIntVar(int someNum); ... } 在我…为什么C++中的void方法可以返回void值,而在其他语言中却不能呢? - java

该程序可以用C ++编译并运行,但不能使用多种不同的语言,例如Java和C#。#include using namespace std; void foo2() { cout << "foo 2.\n"; } void foo() { return foo2(); } int main() {…

<think>我们正在处理用户的问题:“请问JDK包含JRE的解决方法或替代方案”。根据引用内容,我们知道从某个版本开始,JDK不再默认包含JRE。我们需要提供解决方法或替代方案。引用[1]提到:JDK包括了Java编译器、JREJava运行环境)等。但请注意,这是传统的结构。实际上,从JDK9开始,Oracle改变了打包方式,不再单独提供JRE。引用[4]也提到Oracle收购Sun后,情况发生了变化。因此,用户可能遇到的情况是:安装了较新的JDK(如JDK9及以上),发现没有独立的JRE目录。这是因为从JDK9开始,Oracle不再提供独立的JRE安装包,而是将JRE的功能集成在JDK中。但是,用户可能仍然需要独立的JRE来运行Java程序,而不需要整个JDK。解决方案:1.使用JDK自带的jlink工具创建自定义的JRE。2.使用OpenJDK提供的JRE(如果可用)。3.安装较旧版本的JDK(如JDK8)仍然包含独立的JRE,但这不是长久之计。详细步骤:方法一:使用jlink创建自定义JREJDK9开始,引入了模块化系统,可以使用jlink工具创建一个自定义的运行时映像(即JRE)。步骤如下:-确定你的JDK安装目录,例如:`C:\ProgramFiles\Java\jdk-11.0.1`-打开命令提示符(或终端)-使用jlink命令,例如:jlink--add-modulesjava.base--outputmyjre这将创建一个名为myjre的目录,其中包含运行一个简单Java程序所需的最小模块(这里只添加java.base模块,你可以根据程序需要添加更多模块)。-然后,你可以将myjre目录移动到任何地方,并使用其中的bin/java来运行程序。方法二:使用OpenJDK构建的JRE一些OpenJDK的构建版本可能提供独立的JRE。例如,AdoptOpenJDK(现在为EclipseAdoptium)提供独立的JRE下载。用户可以到其官网下载对应平台的JRE。方法三:继续使用JDK8如果项目仍然需要传统的独立JRE,可以考虑继续使用JDK8(但注意,JDK8的公开更新已经结束,可能存在安全风险)。另外,引用[3]提供了一些命令,但这些命令是用于设置JDK作为系统默认Java的,JRE问题无关。总结:现代JDK(9及以上)不包含独立的JRE,但我们可以通过jlink创建自定义运行时,或者从其他提供方获取独立的JRE。根据上述分析,我们可以这样回答用户:</think>### JDK包含 JRE 的解决方法替代方案 从 JDK 9 开始,Oracle 官方不再提供独立的 JRE 安装包或默认在 JDK 中附带 JRE 目录[^4]。以下是完整的解决方案: #### 一、官方推荐方案:使用 `jlink` 创建自定义运行时 1. **原理** JDK 9+ 引入模块化系统(JPMS),可通过 `jlink` 工具按需构建轻量级运行时环境(相当于自定义 JRE)。 2. **操作步骤** ```bash # 列出可用模块 jdeps --list-deps your-app.jar # 创建自定义运行时(示例) jlink --add-modules java.base,java.sql --output myjre # 使用自定义运行时执行程序 ./myjre/bin/java -jar your-app.jar ``` - `--add-modules`:指定应用程序依赖的模块(如 `java.base` 是核心模块) - `--output`:生成的自定义 JRE 目录名 3. **优势** - 显著减小运行时体积(可控制在 30-50MB) - 避免安装完整 JDK(约 300MB) - 符合模块化安全规范[^1] #### 二、替代方案 1. **使用 OpenJDK 构建的 JRE** 第三方提供预编译的 JRE- [Eclipse Temurin](https://adoptium.net/):提供独立的 JRE 下载 - Amazon Corretto:`apt install java-11-amazon-corretto-jre` 2. **降级使用 JDK 8** 如需传统 JRE 结构: ```bash # Ubuntu 示例 sudo apt install openjdk-8-jre ``` > **注意**:官方已于 2019 年停止 JDK 8 公共更新[^4],仅建议用于遗留系统。 3. **容器化部署** 使用 Docker 封装运行时环境: ```dockerfile FROM eclipse-temurin:17-jre COPY app.jar /app.jar CMD ["java", "-jar", "/app.jar"] ``` #### 三、技术原理说明 - **模块化变革**:JDK 9+JRE 功能拆分为 `jmods` 目录中的模块(如 `java.base.jmod`),通过 `jlink` 动态组装[^2]。 - **空间优化**:完整 JDK 包含编译器、调试器等开发工具,而运行时仅需核心模块。 - **许可调整**:Oracle 从 JDK 11 起实行新许可模型,独立 JRE 不再免费提供[^4]。 > **关键建议**:对于新项目,优先采用 `jlink` 创建自定义运行时,这是官方推荐的现代部署方式,兼顾效率安全性[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值