为 GTNH 2.8.4 / 2.9.0-beta-3 提供 Java 22+ 启动兼容性辅助:检查 JarFile 实际使用的多版本 JAR 档位,并在需要时引导游戏以 -Djdk.util.jar.version=21 重新启动。
同一份 JAR 支持两个整合包版本,启动提示为中英双语。 该参数只限制多版本 JAR 的版本选择,不会把 Java 25 变成 Java 21,也不能解决所有高版本 Java 兼容问题。
- 从 Releases 下载
jdkjarversion21enforcer-0.6.0.jar。 - 关闭游戏,移除
mods/中旧版本的本模组。 - 将新 JAR 放入对应游戏实例的
mods/文件夹,再启动游戏。
不要同时安装多个版本;-dev.jar 和 -sources.jar 不用于玩家安装。
| 项目 | 范围 |
|---|---|
| Minecraft / Forge | 1.7.10 / 10.13.4.1614 |
| GTNH | 2.8.4、2.9.0-beta-3 |
| Java 22+ | 检查并提供修复流程;本次重点验证 Java 25 |
| Java 21 及以下 | 不启用修复流程,不弹修复提示 |
| 客户端 / 服务端 | 客户端提供重启提示;服务端可生成带参数的启动脚本副本 |
将下面这一行加入游戏的 JVM 参数,然后重新启动:
-Djdk.util.jar.version=21
常见位置:
- HMCL / PCL2 / BakaXL:对应实例的游戏设置 → JVM 参数。
- PrismLauncher / MultiMC:编辑实例 → 设置 → Java → JVM 参数。
- 原版启动器:安装配置 → 编辑 → 更多选项 → JVM 参数。
实际版本确认是 21 后,模组会跳过修复弹窗和额外重启。
Java 22+ 下未确认参数生效时,模组会显示中英双语提示:
| 按钮 | 行为 |
|---|---|
| 应用并重启 / Restart Now | 创建带有所需参数的新 JVM,重新启动当前游戏 |
| 本次跳过 / Skip | 继续当前启动,并显示手动配置说明;本次兼容性问题仍可能存在 |
| 不再询问 / Don't ask again | 保存关闭重启询问的设置;手动配置提醒仍可能显示 |
模组也会尝试更新 config/lwjgl3ify-relauncher.json 的 customOptions。这份配置只对 lwjgl3ify 自身的非 RFB 重启流程有效;RFB 启动不会读取它来修复当前 JVM。因此,在 RFB 环境未配置启动器参数时,后续每次启动仍可能需要重启一次。
重启期间父进程会等待子进程结束,可能增加启动耗时和资源占用。
直接在 Java 命令中加入参数,放在 -jar 之前:
java -Djdk.util.jar.version=21 -Xmx8G -jar your-server.jar nogui将 your-server.jar 替换为实际服务端 JAR。对于已安装本模组且能运行到初始化阶段的服务端,模组会尝试为识别到的 start / run 等脚本生成 *-with-jdk-jar-21.bat 或 .sh 副本。原脚本不改动,也不自动覆盖已有副本;请检查新脚本后停止服务器,再使用新脚本启动。
在实例的 logs/ 目录搜索下面这条日志:
Verified java.util.jar.JarFile.runtimeVersion().feature() = 21; jdk.util.jar.version=21 is effective.
Tweaker 阶段也可能输出:
Verified JarFile runtime version 21; skipping client-side fallback.
这两条都检查了实际运行版本。模组出现在列表中,或仅看到 forced jdk.util.jar.version=21,不代表参数已经生效。
建议在两个整合包中分别验证:
- Java 25、不传该参数:选择“应用并重启”,确认进入主菜单,且子进程日志显示实际版本为 21。
- Java 25、传入该参数:应跳过修复提示,实际版本仍为 21。
- Java 21:不应弹出本模组的修复提示。
配置文件:config/jdkjarversion21enforcer.cfg。修改后下次启动生效。
| 配置项 | 默认值 | 作用 |
|---|---|---|
auto_patch_lwjgl3ify_config |
true |
创建或更新 lwjgl3ify 重启配置 |
auto_patch_server_start_scripts |
true |
为已识别的服务端脚本生成带参数的副本 |
show_restart_popup_after_patch |
true |
生成服务端脚本后显示重启提醒;无图形环境自动跳过 |
prelaunch_relaunch_prompt |
true |
启用客户端重启询问 |
prelaunch_relaunch_suppressed |
false |
选择“不再询问”后设为 true;改回 false 可恢复询问 |
关闭或抑制重启询问不会让参数自动生效,手动配置提醒仍可能显示。
优先查看实例的 logs/fml-client-latest.log,以及重启子进程的输出:
logs/jdkjarversion21enforcer-relaunch-stdout.log
logs/jdkjarversion21enforcer-relaunch-stderr.log
可搜索的诊断标签:[tweaker]、[launch-args]、[main-args]、[relaunch-cp]。本模组不再记录完整启动参数或登录令牌原文。
- 没有弹窗:确认使用的是 Java 22+;已确认参数生效、关闭了提示或处于无图形环境时,也不会弹窗。
- 重启失败:查看上述 stdout/stderr;子进程短时间内失败时,原进程会尝试继续启动,但不能视为修复成功。可改用启动器直接传参。
- 属性为 21,但实际版本不是 21:属性设置得太晚。必须让新 JVM 在启动时收到
-D参数。 - 已配置
-javaagent仍不生效:JVM 可能在 Agent 的premain之前初始化JarFile。Agent 入口为旧配置保留,会自检并双语告警;它不是启动-D参数的可靠替代。
提交问题时请附上整合包版本、实际 Java 版本、启动方式、相关日志及是否出现重启弹窗。
版本清单及源代码契约见 兼容性说明。本项目保留旧版编译基线,通过两套独立测试 JVM 加载目标版本的真实启动库:
| GTNH | lwjgl3ify | RetroFuturaBootstrap | Gson |
|---|---|---|---|
| 2.8.4 | 2.1.16 | 1.0.11 | 2.10.1 |
| 2.9.0-beta-3 | 3.0.31 | 1.1.1 | 2.13.2 |
:: 完整构建:单元测试、双版本兼容性测试、格式检查与打包
gradlew.bat build
:: 使用 Java 25 验证两个版本的启动库
gradlew.bat testGtnh284 testGtnh29Beta3 -PcompatibilityJavaVersion=25构建使用 Gradle Wrapper,测试默认使用 Java 21 toolchain。Java 25 验证需要可用的 Java 25 toolchain;依赖缓存齐备后可加 --offline。
已完成 104 项基础测试,以及两版各 6 项真实依赖测试;兼容性组分别在 Java 21 / 25 下通过。另已验证 Java 25 中文/空格路径下的 JAR 重启,以及双语提示离屏布局。尚未完成两套完整整合包的进主菜单、进世界或专服实机验收。
v0.6.0 重点修复实际版本误判、启动日志凭据泄露、-jar 重启模式和服务端脚本参数插入,并加入双版本验证与双语提示。历史记录见 开发日志。
A startup compatibility helper for GTNH 2.8.4 and 2.9.0-beta-3 on Minecraft 1.7.10. One JAR supports both packs, with Chinese/English startup dialogs.
Install jdkjarversion21enforcer-0.6.0.jar in mods/. For a permanent setup, add -Djdk.util.jar.version=21 to the game's JVM arguments. On Java 22+, the mod can offer to restart the game with this option. Java 21 and older skip enforcement.
Verify the actual JarFile.runtimeVersion().feature() value in the logs; setting a system property alone is insufficient. Java Agent loading is not a reliable replacement for the startup -D option. Automated tests cover both packs' real launcher libraries on Java 21 and 25; full modpack gameplay and dedicated-server validation remain pending.