JDK9及之后版本使用 jlink 生成定制化的 JRE

许多java软件的运行需要依赖jre,在 jdk8 之后,不再提供默认的 jre,后续如果项目中还是想用 jre 的形式发布软件,那么可以使用 jlink 工具生成 jre。

jlink

二、查看 jdk 中包含的所有模块

如果在 jdk 安装文件夹下执行下述命令,可以看到其中包含的模块,模块所在文件夹与bin同级,文件夹名为jmods,下述是详细使用步骤图示。

bash 复制代码
bin\java --list-modules

1. 打开"jdk"安装文件夹,输入"cmd"后点击回车

2. dos 控制台窗口中输入下述命令,即可查看 jdk 中包含的所有模块

bash 复制代码
bin\java --list-modules

结果如: jdk 11

java.base@11.0.19

java.compiler@11.0.19

java.datatransfer@11.0.19

java.desktop@11.0.19

java.instrument@11.0.19

java.logging@11.0.19

java.management@11.0.19

java.management.rmi@11.0.19

java.naming@11.0.19

java.net.http@11.0.19

java.prefs@11.0.19

java.rmi@11.0.19

java.scripting@11.0.19

java.se@11.0.19

java.security.jgss@11.0.19

java.security.sasl@11.0.19

java.smartcardio@11.0.19

java.sql@11.0.19

java.sql.rowset@11.0.19

java.transaction.xa@11.0.19

java.xml@11.0.19

java.xml.crypto@11.0.19

jdk.accessibility@11.0.19

jdk.attach@11.0.19

jdk.charsets@11.0.19

jdk.compiler@11.0.19

jdk.crypto.cryptoki@11.0.19

jdk.crypto.ec@11.0.19

jdk.crypto.mscapi@11.0.19

jdk.dynalink@11.0.19

jdk.editpad@11.0.19

jdk.hotspot.agent@11.0.19

jdk.httpserver@11.0.19

jdk.internal.ed@11.0.19

jdk.internal.jvmstat@11.0.19

jdk.internal.le@11.0.19

jdk.internal.opt@11.0.19

jdk.internal.vm.ci@11.0.19

jdk.internal.vm.compiler@11.0.19

jdk.internal.vm.compiler.management@11.0.19

jdk.jartool@11.0.19

jdk.javadoc@11.0.19

jdk.jcmd@11.0.19

jdk.jconsole@11.0.19

jdk.jdeps@11.0.19

jdk.jdi@11.0.19

jdk.jdwp.agent@11.0.19

jdk.jfr@11.0.19

jdk.jlink@11.0.19

jdk.jshell@11.0.19

jdk.jsobject@11.0.19

jdk.jstatd@11.0.19

jdk.localedata@11.0.19

jdk.management@11.0.19

jdk.management.agent@11.0.19

jdk.management.jfr@11.0.19

jdk.naming.dns@11.0.19

jdk.naming.ldap@11.0.19

jdk.naming.rmi@11.0.19

jdk.net@11.0.19

jdk.pack@11.0.19

jdk.rmic@11.0.19

jdk.scripting.nashorn@11.0.19

jdk.scripting.nashorn.shell@11.0.19

jdk.sctp@11.0.19

jdk.security.auth@11.0.19

jdk.security.jgss@11.0.19

jdk.unsupported@11.0.19

jdk.unsupported.desktop@11.0.19

jdk.xml.dom@11.0.19

jdk.zipfs@11.0.19

结果如: jdk 17

java.base@17.0.9

java.compiler@17.0.9

java.datatransfer@17.0.9

java.desktop@17.0.9

java.instrument@17.0.9

java.logging@17.0.9

java.management@17.0.9

java.management.rmi@17.0.9

java.naming@17.0.9

java.net.http@17.0.9

java.prefs@17.0.9

java.rmi@17.0.9

java.scripting@17.0.9

java.se@17.0.9

java.security.jgss@17.0.9

java.security.sasl@17.0.9

java.smartcardio@17.0.9

java.sql@17.0.9

java.sql.rowset@17.0.9

java.transaction.xa@17.0.9

java.xml@17.0.9

java.xml.crypto@17.0.9

jdk.accessibility@17.0.9

jdk.attach@17.0.9

jdk.charsets@17.0.9

jdk.compiler@17.0.9

jdk.crypto.cryptoki@17.0.9

jdk.crypto.ec@17.0.9

jdk.crypto.mscapi@17.0.9

jdk.dynalink@17.0.9

jdk.editpad@17.0.9

jdk.hotspot.agent@17.0.9

jdk.httpserver@17.0.9

jdk.incubator.foreign@17.0.9

jdk.incubator.vector@17.0.9

jdk.internal.ed@17.0.9

jdk.internal.jvmstat@17.0.9

jdk.internal.le@17.0.9

jdk.internal.opt@17.0.9

jdk.internal.vm.ci@17.0.9

jdk.internal.vm.compiler@17.0.9

jdk.internal.vm.compiler.management@17.0.9

jdk.jartool@17.0.9

jdk.javadoc@17.0.9

jdk.jcmd@17.0.9

jdk.jconsole@17.0.9

jdk.jdeps@17.0.9

jdk.jdi@17.0.9

jdk.jdwp.agent@17.0.9

jdk.jfr@17.0.9

jdk.jlink@17.0.9

jdk.jpackage@17.0.9

jdk.jshell@17.0.9

jdk.jsobject@17.0.9

jdk.jstatd@17.0.9

jdk.localedata@17.0.9

jdk.management@17.0.9

jdk.management.agent@17.0.9

jdk.management.jfr@17.0.9

jdk.naming.dns@17.0.9

jdk.naming.rmi@17.0.9

jdk.net@17.0.9

jdk.nio.mapmode@17.0.9

jdk.random@17.0.9

jdk.sctp@17.0.9

jdk.security.auth@17.0.9

jdk.security.jgss@17.0.9

jdk.unsupported@17.0.9

jdk.unsupported.desktop@17.0.9

jdk.xml.dom@17.0.9

jdk.zipfs@17.0.9

可以在 jdk 安装文件夹下使用以下命令(windows)生成 myjre

bash 复制代码
bin\jlink --module-path jmods --add-modules java.base,java.desktop --output myjre

linux系统执行以下命令生成 myjre:

bash 复制代码
./bin/jlink.exe --module-path jmods --add-modules java.desktop --output myjre

注:

1.如果JDK安装文件夹在C:\Program Files\Java\jdk11.0.18,由于系统权限问题无法生成,需要将JDK安装文件夹复制到其他目录中。

2.这条命令是使用Java的jlink工具来创建一个包含java.desktop模块的自定义的运行时映像(JRE),并将其输出到名为myjre的文件夹中。以下逐一解析这条命令的各个部分:

2.1 **bin\jlink.exe**:这是jlink工具的执行路径。jlink是Java 9及更高版本中引入的一个工具,它允许开发者创建一个自定义的JRE,只包含他们需要的Java模块。

2.2 **--module-path jmods**:这个选项指定了模块路径。jmods目录应该包含.jmod文件,这些文件描述了Java的模块。

2.3 **--add-modules java.desktop**:这个选项指定了需要包含在自定义JRE中的模块。在这个例子中,我们添加了java.desktop模块。这意味着JRE将包含该模块及其依赖项。

2.4 **--output myjre**:这个选项指定了输出目录,即生成的JRE将被放置的位置。在这个例子中,输出的是名为myjre的文件夹。

生成后的jre所在文件夹为myjre,在myjre文件夹下执行下述命令来查看 myjre 中添加的模块。

bash 复制代码
bin\java --list-modules

四、NoClassDefFound错误原因及解决方法

如果在使用自定义的 jre 运行 java 程序时,出现 NoClassDefFound 错误

原因:jre 中没有添加相关的模块。

解决方法: 首先,需要确定缺少的 class 存在于那个 jdk module 中,然后在 jlink 命令中添加到 --add-modules 列表中,重新生成 jre 就可以了。

相关推荐
缺点内向3 小时前
Java:创建、读取或更新 Excel 文档
java·excel
带刺的坐椅4 小时前
Solon v3.4.7, v3.5.6, v3.6.1 发布(国产优秀应用开发框架)
java·spring·solon
四谎真好看5 小时前
Java 黑马程序员学习笔记(进阶篇18)
java·笔记·学习·学习笔记
桦说编程5 小时前
深入解析CompletableFuture源码实现(2)———双源输入
java·后端·源码
java_t_t5 小时前
ZIP工具类
java·zip
lang201509286 小时前
Spring Boot优雅关闭全解析
java·spring boot·后端
pengzhuofan7 小时前
第10章 Maven
java·maven
百锦再7 小时前
Vue Scoped样式混淆问题详解与解决方案
java·前端·javascript·数据库·vue.js·学习·.net
刘一说7 小时前
Spring Boot 启动慢?启动过程深度解析与优化策略
java·spring boot·后端
壹佰大多7 小时前
【spring如何扫描一个路径下被注解修饰的类】
java·后端·spring