Skip to content

About

No description, website, or topics provided.

Resources

Stars

4 stars

Watchers

0 watching

Forks

Repository files navigation

JDK Jar Version 21 Enforcer

为 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 兼容问题。

下载 v0.6.0 · 报告问题 · 双版本兼容性说明

安装

  1. 从 Releases 下载 jdkjarversion21enforcer-0.6.0.jar。
  2. 关闭游戏,移除 mods/ 中旧版本的本模组。
  3. 将新 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,不代表参数已经生效。

建议在两个整合包中分别验证:

  1. Java 25、不传该参数:选择“应用并重启”,确认进入主菜单,且子进程日志显示实际版本为 21。
  2. Java 25、传入该参数:应跳过修复提示,实际版本仍为 21。
  3. 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 重启模式和服务端脚本参数插入,并加入双版本验证与双语提示。历史记录见 开发日志。

English overview

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.

About

No description, website, or topics provided.

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages