精简java运行环境,仅占用50MB, 适配Minecraft1.19,1.20,1.21
更新内容:
- jre21加入javafx模块版本,以支持免环境启动HMCL(需要额外的35MB)
- jre21添加--compress=zip-9参数,占用内存更小
- 所有使用的jdk/java/jre/jfx均使用Adoptium Eclipse Temurin/HMCL下载的jfx
精简效果:
精简前216MB —> 精简后52.2MB!! 完美启动Minecraft
下载地址:
版本提示:
- 带-jfx后缀的mcjre支持HMCL免环境启动,即包含javafx模块
- 高版本Java向下兼容低版本Minecraft
- 请注意,当使用某些与操作系统不匹配的Java版本(32或64位)、使用某些Java 7版本或安装了多个版本的Java玩Minecraft Java版时可能会引发某些用户体验问题。
- 从1.12(17w13a)开始,运行Minecraft的最低要求是Java 8。如果玩家不知道他们的电脑是否安装了Java 8,那么安装程序默认会自动安装并使用支持Minecraft运行的Java。
- 从1.17(21w19a)开始,运行Minecraft的最低要求是Java 16。
- 从1.18(1.18-pre2)开始,运行Minecraft的最低要求是Java 17。
- 从1.20.5(24w14a)开始,运行Minecraft的最低要求是Java 21,且操作系统要求为64位。
精简过程:
核心是使用jlink工具,导出需要的jmod模块
基础命令:
"<jlink路径>" --module-path <其他模块路径> --compress=zip-9 --strip-debug --no-header-files --no-man-pages --strip-debug --strip-java-debug-attributes --dedup-legal-notices=error-if-not-same-content --output <输出文件夹名> --add-modules <添加的jmod模块1,添加的jmod模块2,...>
- --output:输出jre文件夹名
- --module-path:指定模块路径(用分号";"隔开)
- --add-modules:指定添加的模块
- --compress:设置压缩级别(java17为0至2,java21为zip-1至zip-9)
- 其他参数为剔除一些相对无用功能和组件
添加模块:
添加基础模块:
java.base,java.desktop,java.instrument,java.management,java.naming,java.prefs,java.rmi,java.scripting,java.sql,jdk.compiler,jdk.httpserver,jdk.unsupported,jdk.crypto.ec
尝试使用制作的jre启动Minecraft,得到崩溃日志:
hmcl: minecraft.log
PCL2:游戏崩溃前的输出.log
把日志给AI分析,问出缺少的模块名加入命令,打包jre再启动,崩溃再分析,以此循环直到正常启动
可用AI:chatgpt,claude,天工,文心一言等
最后再加上一些需要的参数即可得到打包瘦身的jre
精简版MCJRE含有的模块:
游戏主程序所需模块
java.base
java.logging
java.naming
java.xml
jdk.sctp
jdk.unsupported
java.desktop
java.sql
jdk.charsets
java.net.http
jdk.xml.dom
jdk.jsobject
jdk.jfr
jdk.net
java.rmi
jdk.crypto.ec
jdk.nio.mapmode
jdk.naming.dns
jdk.zipfs
java.scripting
jdk.dynalink
java.instrument
java.compiler
java.managementjdk.management(1.20FML新增)
HMCL所需的额外模块:(版本19.0.2.1)
javafx.base
javafx.controls
javafx.graphics
javafx.media
javafx.web
完整命令:(Windows)
REM #adopt 21& jfx
"<jlink路径>" --module-path <jfx模块路径> --compress=zip-9 --strip-debug --no-header-files --no-man-pages --strip-debug --strip-java-debug-attributes --dedup-legal-notices=error-if-not-same-content --output mcjre-21.0.4+7-jfx --add-modules java.base,java.logging,java.naming,java.xml,jdk.sctp,jdk.unsupported,java.desktop,java.sql,jdk.charsets,java.net.http,jdk.xml.dom,jdk.jsobject,jdk.jfr,jdk.net,java.rmi,jdk.crypto.ec,jdk.nio.mapmode,jdk.naming.dns,jdk.zipfs,java.scripting,jdk.dynalink,java.instrument,java.compiler,java.management,jdk.management,javafx.base,javafx.controls,javafx.graphics,javafx.media,javafx.web
REM #adopt 21
"<jlink路径>" --compress=zip-9 --strip-debug --no-header-files --no-man-pages --strip-debug --strip-java-debug-attributes --dedup-legal-notices=error-if-not-same-content --output mcjre-21.0.4+7 --add-modules java.base,java.logging,java.naming,java.xml,jdk.sctp,jdk.unsupported,java.desktop,java.sql,jdk.charsets,java.net.http,jdk.xml.dom,jdk.jsobject,jdk.jfr,jdk.net,java.rmi,jdk.crypto.ec,jdk.nio.mapmode,jdk.naming.dns,jdk.zipfs,java.scripting,jdk.dynalink,java.instrument,java.compiler,java.management,jdk.management
REM #adopt 17& jfx
"<jlink路径>" --module-path <jfx模块路径> --compress=2 --strip-debug --no-header-files --no-man-pages --strip-debug --strip-java-debug-attributes --dedup-legal-notices=error-if-not-same-content --output mcjre-17.0.8+7-jfx --add-modules java.base,java.logging,java.naming,java.xml,jdk.sctp,jdk.unsupported,java.desktop,java.sql,jdk.charsets,java.net.http,jdk.xml.dom,jdk.jsobject,jdk.jfr,jdk.net,java.rmi,jdk.crypto.ec,jdk.nio.mapmode,jdk.naming.dns,jdk.zipfs,java.scripting,jdk.dynalink,java.instrument,java.compiler,java.management,jdk.management,javafx.base,javafx.controls,javafx.graphics,javafx.media,javafx.web
REM #adopt 17
"<jlink路径>" --compress=2 --strip-debug --no-header-files --no-man-pages --strip-debug --strip-java-debug-attributes --dedup-legal-notices=error-if-not-same-content --output mcjre-17.0.8+7 --add-modules java.base,java.logging,java.naming,java.xml,jdk.sctp,jdk.unsupported,java.desktop,java.sql,jdk.charsets,java.net.http,jdk.xml.dom,jdk.jsobject,jdk.jfr,jdk.net,java.rmi,jdk.crypto.ec,jdk.nio.mapmode,jdk.naming.dns,jdk.zipfs,java.scripting,jdk.dynalink,java.instrument,java.compiler,java.management,jdk.management
配置好PATH的情况下,可以将路径改成 jlink
参考文章: