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 就可以了。

相关推荐
小电玩17 分钟前
JAVA SE8
java·开发语言
努力的布布35 分钟前
Spring源码-从源码层面讲解声明式事务的运行流程
java·spring
程序员大金41 分钟前
基于SpringBoot的旅游管理系统
java·vue.js·spring boot·后端·mysql·spring·旅游
小丁爱养花43 分钟前
记忆化搜索专题——算法简介&力扣实战应用
java·开发语言·算法·leetcode·深度优先
大汉堡~1 小时前
代理模式-动态代理
java·代理模式
爱上语文1 小时前
Springboot三层架构
java·开发语言·spring boot·spring·架构
loveLifeLoveCoding1 小时前
Java List sort() 排序
java·开发语言
草履虫·1 小时前
【Java集合】LinkedList
java
AngeliaXue1 小时前
Java集合(List篇)
java·开发语言·list·集合
世俗ˊ1 小时前
Java中ArrayList和LinkedList的比较
java·开发语言