Skip to content

手动创建 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 即可。