点了启动,然后呢?有的服几秒就退回“已停止”,有的卡在“正在启动”,有的显示运行中却始终没有出现 Done。看起来都是“启动失败”,但原因完全不在同一层,重装核心通常一种也治不好。
启动是一条链:应用先铺好运行环境,再找一个 Java,用它去跑核心里那个 jar,核心读配置、绑端口、加载世界,最后才打印 Done。任何一环断了,现象都像“开不起来”。
这一页按这条链的顺序,把六层拆开:环境 → Java → 核心 → 配置 → 端口 → 世界。你只要从最外层开始,一层层排除,卡在哪层就停在哪层修。
先给现象分类:没反应 / 秒退 / 卡住 / 没有 Done,四类的怀疑对象完全不同。
启动成功的唯一标志是终端出现 Done,状态显示“运行中”不算。
排查顺序固定:环境 → Java → 核心 → 配置 → 端口 → 世界,不要跳层。
换核心不能解决 Java 问题,反而可能要求更高版本的 Java。
先分清四种“失败”#
同样是“起不来”,四类现象的下一步动作差别很大。先对照这张表给自己归类,再往下走。
| 现象 | 你在界面上看到什么 | 优先怀疑 |
|---|---|---|
| 点启动没反应、按钮是灰的 | 按钮点不动,或提示环境/Java 未就绪 | 环境未初始化、Java 未安装、核心未选择 |
| 秒退(几秒内回到已停止) | 状态闪一下又变回停止 | Java 版本不对、jar 损坏、配置语法错、installer 没跑完 |
| 卡在启动阶段 | 状态是启动中,进度不动 | 世界生成慢、模组加载、下载依赖、磁盘或内存不足 |
运行中但没有 Done | 状态“运行中”,终端有输出但没完成 | 世界加载慢、端口绑定失败、控制台里的错误被忽略 |
第三、四类最容易混淆:状态来自进程是否活着,而能不能进服取决于端口有没有开始监听,这两件事不是一回事。
不管哪一类,先打开「终端」把最后 20 行看一遍。90% 的失败能在这里看到 Exception、ERROR 或一句明确的中文摘要,比猜快得多。看不懂就按 小白看日志 找关键词。
它看退出码和启动窗口:退出码非 0 一律算异常;退出码是 0 但发生在启动后 20 秒内,也算“启动阶段即退出”。所以秒退一定会被记成异常退出并生成崩溃报告。
第 1 层:运行环境没准备好#
典型现象:启动按钮半透明或点不动;概览页一直挂着「初始化运行环境」;下载核心时提示环境未初始化。
先看哪里:概览页顶部有没有「初始化运行环境」卡片;「依赖与环境管理」里 Termux 那一项是什么状态;手机的剩余存储。
判断标准:卡片消失、Termux 状态正常,才算这一层通过。只要卡片还在,后面所有操作都会失败,连核心都下不下来。
处理动作,按顺序试:
等它跑完:首次初始化要下载约 50 MB 的运行环境,网速慢时几分钟很正常,进度还在走就别动它。
换镜像源重试:失败时先点卡片上的「切换到下个镜像源」,再重试一次。
腾出空间:至少留 1 GB 余量。存储写满时初始化会中断,而且报错往往只有一句
No space left on device。卸载运行环境后重新初始化:连续失败再做这一步。它只会重装那套迷你 Linux 环境,公共存储里的服务端目录和存档还在。
实在判断不了,就去「更多 → 运行诊断」跑一次。它会把运行环境、Java、关键命令、字体、核心目录、存储空间、本地端口一次性列出来,能一键修复的只有运行环境、Java、命令、字体这几类;端口和核心文件它不会替你改。
第 2 层:Java 版本或来源不对#
典型现象:秒退,终端最后几行是一段 UnsupportedClassVersionError;或者启动设置里选不到想要的版本。
先看哪里:概览页「当前运行环境」显示的是哪个来源、哪个版本;启动设置抽屉(启动服务端卡片右上角齿轮)里选的是不是同一个。
判断标准:版本和核心要求一致、且这个来源确实提供该版本,才算通过。
java.lang.UnsupportedClassVersionError: ... class file version 65.0,
this version ... only recognizes class file versions up to 61.0这段的意思是:服务端要 Java 21(65),你跑的是 Java 17(61)。版本对应关系照着这张表看:
| 服务端版本 | 需要的 Java | 常见可用来源 |
|---|---|---|
| ≤ 1.16 | Java 8 | 只有 PRoot 的 Ubuntu 20.04 提供;Termux、Pojav 都没有 |
| 1.17 – 1.20.6 | Java 17 | Termux JDK、Pojav JRE、PRoot |
| 1.21 及以上 | Java 21 | Termux JDK、Pojav JRE、PRoot |
| 26 及以上 | Java 25 | Termux JDK、Pojav JRE;PRoot 没有 25 |
处理动作:
1.21+ 却在用 Java 17 → 装 Java 21,再在启动设置里选它;
1.16 及以下 → 切到「PRoot Linux 容器」+「Ubuntu 20.04」+ Java 8;
提示“当前来源不提供该版本” → 按提示换来源或换版本,应用不会替你偷偷换来源。
换个核心,它可能要求更高的 Java,问题反而更明显。先把 Java 这一层弄对,再考虑换核心。另外 Allay 强制要求 Java 21 以上,Modrinth 整合包也常常按新版本 Java 打包,别拿旧环境硬试。
第 3 层:核心文件有问题#
典型现象:秒退,提示找不到主类、Invalid or corrupt jarfile;Forge/NeoForge 装到一半没了下文;选了 BDS 启动被拒。
先看哪里:下载页的「已安装核心列表」里该核心是否正常显示;核心目录里入口 jar 在不在;启动设置里「当前核心」是不是你要跑的那个。
判断标准:核心列表显示正常、入口文件存在、installer 已经跑完,才算通过。
逐项处理:
先试「校验修复」:下载页对已安装核心提供校验修复,能修好一部分下载不完整的情况。
修不好就删掉重下:删之前先备份世界,别连
world/一起删掉。等 installer 跑完:Forge、NeoForge、Quilt 首次安装要下载一堆库,几分钟到十几分钟都正常,中途别切核心。
选 BDS 的话先查环境:BDS 是 x86_64 + glibc 的程序,靠 PRoot + box64 转译运行,没初始化专用环境就点启动会被拦住。去「依赖与环境管理 → BDS」点「初始化环境」再回来,见 官方基岩版(BDS)开服。
别用网盘里的 jar 替换:来源不明的“整合包 jar”可能被打过补丁,也可能根本不是这个版本。
核心层还有一个隐蔽的坑:换了核心却没清掉旧的 libraries 缓存,新核心加载到旧库会报一堆 NoSuchMethodError。
第 4 层:配置写错了#
典型现象:启动时提示配置解析失败、找不到世界、端口值非法;或者能启动但行为和你想的不一样。
先看哪里:server.properties 的最近改动;level-name 指向的目录是否存在;server-port 的值。
判断标准:把配置改回上一次能用的版本后能正常启动,就说明问题在这一层。
最常见的四种写错:
拼写错或少了等号,例如
server-port 25565(中间必须用=);值两边的引号、空格被一起写进去,
server-port= 25565这种在某些核心上会解析失败;level-name指向一个不存在的目录,核心会去新建,但如果同名文件被占用就直接报错;端口写成 0、负数或大于 65535。这里要注意:配置页不校验数值范围,填错也会保存。
# server.properties 里最常被改坏的两行
server-port=25565
level-name=world处理动作:改回上一个能用的版本;没有备份就对着 配置速查 逐项核对。改完一定要重启才生效,改文件不会热加载。PocketMine 系要注意 server.properties 与 pnx.yml 谁在生效,PNX 的 YAML 缩进错了报错会更难懂。
先停服 → 用「文件」页的文本编辑器改 → 确认保存成功 → 再启动。文件页的编辑和删除不检查服务端是否在运行。
第 5 层:端口被占或绑不上#
典型现象:启动到一半退出,日志里出现绑定失败;或者状态“运行中”但朋友连不上。
先看哪里:概览页状态(是不是已经有一个服在跑);终端里的 FAILED TO BIND TO PORT;配置文件里的 server-port。
判断标准:日志里出现 Done 且没有绑定报错,端口才算真的起来了。同一个端口在同一时刻只能被一个进程占用。
[Server thread/ERROR]: **** FAILED TO BIND TO PORT!
The exception was: java.net.BindException: Address already in use
Perhaps a server is already running on that port?处理动作:
先确认是不是自己的旧进程还活着——概览页看状态,必要时点「强制停止」(有二次确认,会丢未保存数据)。
换一个端口(例如 25566),改完重启;用了隧道的话,隧道那边的目标端口也要同步改。
关掉可能占用该端口的其它应用,或者直接重启手机释放异常占用。
Minexa 没有启动前的端口预检,只有启动后的诊断探测。
普通「停止」是向控制台发送 stop,最多等 180 秒让服务端存档退出。超时后不会强杀,而是提示你可以「强制停止」。很多“端口被占用”其实是上一次停止还没结束你就又点了启动。
第 6 层:世界与存档#
典型现象:卡在 Preparing level "world" 很久;提示 level.dat 损坏、区块读取失败;日志里有 Failed to load level。
先看哪里:最近有没有降级过版本、有没有手动替换过 world/ 目录、有没有在服务端运行时拷过文件、磁盘是不是写满了。
判断标准:换一个新建的空世界能正常启动,而原来的世界不行,就说明问题在存档本身。
[Server thread/ERROR]: Failed to load level 'world'
java.io.IOException: Level is corrupt处理动作:
先停服,把当前
world/整个复制一份留底(这一步比任何修复都重要)。从最近一次备份还原世界。注意:还原必须先停服,而且没有二次确认,点一下就执行,详见 备份、还原与世界管理。
没有备份时,先尝试只替换
level.dat;还是不行再考虑重置世界——那意味着地形和建筑全丢,只有确认没救时才做。不要用来源不明的“存档修复工具”反复写
level.dat,写坏一次就再也读不回来了。
版本降级是这里最常见的坑:高版本世界被低版本核心打开时区块格式对不上,表现就是卡在加载或直接报损坏。
六层都查过还不行:最小化重建#
如果六层都过了还是起不来,就别再原地打转了。按下面的顺序重建,每一步都保留可回退的备份。
备份:整服备份一次,确认备份文件生成了再继续。
建一个干净的同版本服:新建空 Paper(和原来同版本),不装任何插件模组,先确认它能出
Done。搬世界:把旧世界的
world/拷到新服,再启动。能起来 → 问题在原服的配置或内容;起不来 → 问题在世界。逐个加回插件/模组:每加一个启动一次,出问题就停在那一个。
决定替换还是放弃:确认是某个插件/模组不兼容时,换版本或换替代品,比继续硬修省时间。
这个流程比重装快,也不会丢世界。整篇的顺序可以浓缩成一张表:
| 顺序 | 检查 | 通过标准 | 不通过去哪 |
|---|---|---|---|
| 1 | 运行环境 | 初始化卡片消失、Termux 正常 | 环境管理 |
| 2 | Java | 版本匹配、来源提供该版本 | Java 版本 |
| 3 | 核心 | 列表正常、installer 完成、非 BDS | 下载页 |
| 4 | 配置 | 语法正确、端口和世界名合法 | 配置基础 |
| 5 | 端口 | 无占用、能监听 | 联机排错 |
| 6 | 世界 | 能加载、未损坏、磁盘有空间 | 崩溃与存档 |
终端里出现过
Done (...)! For help, type "help",不是停在Starting server。概览页「当前运行环境」的 Java 版本和服务端要求的版本一致。
server-port是 1–65535 的整数,且没有第二个服务端在跑同一个端口。日志里搜不到
UnsupportedClassVersionError、Address already in use、Level is corrupt这三类词。有一个刚做的备份,能说出它在哪个目录。