手动创建 jre
为什么需要 jre
正常情况下,Java 开发直接下载 jdk 即可,jdk 内部包含了 jre。但是当我们做一些 Java 程序的整合包时,为了减小包体积,会在整合包中使用更加轻便的 jre。
怎样创建 jre
从 Java 9 开始,Oracle 不再单独提供 JRE 下载,而是推荐使用 JDK 或通过 jlink 工具生成自定义的 jre。下面以 windows11 + jdk21 为例,演示创建 jre21 的方式。
首先下载并安装 jdk
首先去 官网 下载 jdk21。安装 jdk。假设安装完后目录如下:
text
D:\software\jdk
-- bin
-- java.exe
-- javaw.exe
-- jlink.exe
-- jmods
-- ...
手动创建 jre
执行如下命令创建 jre21:
java
D:\software\jdk\bin\jlink.exe --module-path D:\software\jdk\jmods --add-modules java.base,java.desktop,java.logging,java.management,java.naming,java.security.jgss,java.instrument --output myjre21
说明:
- --add-modules:java9 之后,采用了模块化的方式,所以在我们创建 jre 时,需要自行选择要把哪些模块添加到 jre 中,这样的方式使得生成的 jre 只包含需要的模块,包体积会更小
- --output myjre21:生成的 myjre21 的包就是我们创建出来的 jre,直接
myjre21/bin/java.exe -version
查看 Java 版本
注意:如果我们使用了 SpringBoot(加入了SpringBootWebStarter),以上的模块是我们的最小单元,如果启动程序时,发现报错类似 java.lang.ClassNotFoundException: java.lang.instrument.IllegalClassFormatException
,通常是表明缺乏某些模块。可以使用如下的提示语到 DeepSeek(开启联网) 来查询缺乏的模块:
text
使用 jlink 生成的自定义 JRE,报错如下:java.lang.ClassNotFoundException: java.lang.instrument.IllegalClassFormatException
DeepSeek 会告知缺乏哪一个模块,将该模块加入到如上的命令里,重建 jre 即可。