错误信息其实已经给出了答案:如果里面写着 class file version 65.0,这个文件就需要 Java 21。计算方式始终一样:数字减去 44 就是 Java 版本。不过比数字更重要的是弄清楚,报错指的是谁的文件:大多数情况下,并不是服务器太旧,而是某个插件太新。
读懂这条提示
典型的一行看起来像这样:
java.lang.UnsupportedClassVersionError: com/example/PluginMain has been compiled by a more
recent version of the Java Runtime (class file version 65.0), this version of the Java Runtime
only recognizes class file versions up to 61.0
这里面有三个信息:
com/example/PluginMain— 谁触发了错误。如果这里是某个插件或 Mod 名称,意思就是:这个文件不匹配,服务器本身没问题。class file version 65.0— 需要什么:65 − 44 = Java 21。only recognizes … up to 61.0— 当前运行的是什么:61 − 44 = Java 17。
翻译成实际情况就是:一个为 Java 21 构建的插件,被放到了运行 Java 17 的服务器上。
换算表
| class file version | Java 版本 |
|---|---|
| 52.0 | Java 8 |
| 55.0 | Java 11 |
| 60.0 | Java 16 |
| 61.0 | Java 17 |
| 65.0 | Java 21 |
| 69.0 | Java 25 |
这些数字来自官方 JVM 规范。从 Java 1.0 开始,差值 44 一直保持不变,所以未来的版本你也可以自己算出来,不需要一直扩展表格。
记住: 一个 Java 运行时总是能理解所有更旧的 class 文件版本,但永远不能理解更新的版本。所以 Java 8 插件通常可以在 Java 21 下运行,反过来则不行。
哪个 Minecraft 版本需要哪个 Java 版本?
| Minecraft 版本 | 所需 Java |
|---|---|
| 至 1.16.5 | Java 8 |
| 1.17 – 1.17.1 | Java 16(实际通常用 Java 17) |
| 1.18 – 1.20.4 | Java 17 |
| 从 1.20.5 起 | Java 21 |
| 从 26.0 起 | Java 25 |
在我们这里你不需要手动设置。 我们会根据你服务器的 Minecraft 版本推导运行时,并自动设置。你订购 1.21,就会得到 Java 21,不需要到处找开关。
对于 Leaf 和 Leaves 这样的服务器 Fork,我们还会按每个 Release 维护一份精确对应关系,而不是直接套用通用规则。原因是:Fork 可以偏离 Vanilla 的要求,而乐观假设往往会在关键时刻出错。如果某个组合找不到合适的 Java,我们会有意中止流程,而不是启动一个过低的运行时。一个根本不会错误启动的服务器,比一个半正常运行的服务器更容易修复。
最常见的情况:是插件,不是服务器
如果你的服务器刚才还能运行,而错误是在添加某个文件之后出现的,那情况就很清楚。处理步骤:
- 记下提示里的类名。 它几乎总会指向对应项目。
- 到提供方那里找合适的构建版本。 很多插件会分别提供 Java 17 和 Java 21 的下载,常见标记是
-java17,或者作为单独的 Release 分支。最新文件不一定就是正确文件。 - 如果没有合适版本,你就需要更新的 Minecraft 版本,因为只有它才会带来更新的运行时。如何在不丢失世界的情况下切换版本,可以看 切换 Minecraft 服务器版本。
- 如果服务器必须马上运行,先移除插件。 如何干净地添加和移除插件,可以看 安装 Minecraft Mods 和插件。
另一种情况:Java 太新
这种情况很少被解释,但其实经常发生。老 Forge Modpack,典型例子是 1.12.2,是为 Java 8 构建的。在 Java 21 下它们会失败,不过通常不是 UnsupportedClassVersionError,而是提示缺少内部类或启动参数被拒绝。
特征是:这个 Pack 以前能运行,或者在别人那里能运行,而你的服务器显示的是一个非常旧的 Minecraft 版本。解决办法这时不是使用更新的 Java,而是在面板里选择这个 Pack 对应的 Minecraft 版本,这样我们就会设置匹配的旧运行时。
坦白说明: 我们的自动修正在这种情况下不会介入。它只会修复“太旧”的方向,也就是服务器需要比当前运行中更新的 Java。太新的 Java 不会被视为漂移,这是有意设计的,否则一个刻意选择旧运行时的客户,会被系统自动改回去。
我们会自动处理什么
- 订购时就匹配运行时。 Java 版本跟随 Minecraft 版本,无需设置。
- 版本切换时自动修正。 如果你切换到需要更高 Java 的版本,运行时会一起调整。
- 启动日志优先于推算。 如果你的服务器在启动时自己指出需要的 Java 版本高于当前运行时,我们会根据这次测量来修正,而不是只依赖订购版本推导。服务器对自身的说明,比任何表格都更可靠。
- 自定义镜像不受影响。 如果你的服务器运行在你自己选择的运行时上,我们不会介入。
- 失败即停止,而不是半对半错。 如果某个组合没有合适的 Java,我们会中止并报告,而不是启动错误的运行时。
Troubleshooting
| 症状 | 检查 | 解决办法 |
|---|---|---|
提到 class file version 65.0,类名是插件 |
添加之前服务器能运行吗? | 下载适合你 MC 版本的插件构建 |
| 服务器启动时直接报错,未提到插件 | 正在运行哪个 Minecraft 版本? | 让版本和运行时保持一致 |
| 旧的 1.12.2 Modpack 无法启动 | 日志是否提到缺少内部类? | Java 太新了,选择匹配的 MC 版本 |
| 版本切换后报错 | 是否刚切换完就出现? | 等待重启完成;如果仍然存在,带完整那一行联系支持 |
| 插件加载了,但功能缺失 | 日志里是警告而不是错误吗? | 另有原因,不是 Java 版本 |
FAQ
我可以自己切换 Java 版本吗?
在我们这里不需要:它由你服务器的 Minecraft 版本决定。如果你需要另一个运行时,正确做法是切换 Minecraft 版本,这样整个环境才会匹配。
更新的 Java 总是更好吗?
不是。对 Minecraft 来说,要求的版本同时也是一个实用上限:服务器核心、Mods 和插件都是围绕它调好的。凭感觉跳到更高运行时没有好处,还可能弄坏旧 Mods。
为什么我的插件本地能运行,服务器上不行?
因为你本地安装的 Java 可能比服务器上的更新。关键是服务器上的运行时,而不是你电脑上的运行时。
我怎么知道服务器现在用的是哪个 Java?
提示会告诉你:only recognizes class file versions up to 61.0 表示 Java 17。如果没有错误信息,服务器启动时会在控制台最前面的几行写出 Java 版本。
Java 切换后我需要重新创建世界吗?
不需要。运行时只影响执行,不影响世界格式。不过切换 Minecraft 版本 可能改变世界格式,所以之前要先创建备份。
下一步
如果服务器恢复运行但仍然很慢,可以继续看 Minecraft 服务器卡顿:修复 Watchdog 超时。如果内存不适合 Modpack 大小,Minecraft RAM 计算器 可以帮你算出需求。
你在找一个 Java 版本会自动匹配游戏版本的服务器?在 租用 Minecraft 服务器 可以查看套餐。
来源和验证环境
- 各 Minecraft 版本的 Java 要求: Minecraft Wiki — Server/Requirements。其中明确提到从 1.17 起需要 Java 16,从 1.18 起需要 Java 17,从 1.20.5 起需要 Java 21。
- class-file 版本对应关系: Oracle — The Java Virtual Machine Specification, Java SE 21, 表 4.1-A。证明 52 = Java 8、55 = Java 11、60 = Java 16、61 = Java 17、65 = Java 21,并说明 JVM 只支持列出的版本,不支持更高版本。
- Java 25: Oracle — The Java Virtual Machine Specification, Java SE 25, 表 4.1-A。证明 Major 69。
验证环境: 2026 年 8 月 24 日。新的 Minecraft 版本可能带来新的 Java 要求;链接中的来源分别代表当前状态。