1. 服务端选型:别只盯着官方 jar,Paper 和模组服核心各有各的玩法人
我第一次开《我的世界》Java 版服务器时踩过最大的坑,就是“照着网上教程下了个官方服务端就开整”。官方服务端不是不能玩,但它只适合那种三五个人进去纯粹生存的小圈子,一旦你想加管理插件、想搞领地、想优化卡顿、想让服务器在低配云主机上多撑几个人,原版 jar 很快就顶不住了。更麻烦的是,官方服务端连最基本的“管理员命令补全”都没有,经常我在地图里跑图,背后刷了怪,还得切出游戏去打命令,体验非常割裂。
所以在正式开服之前,先把服务端核心这件事搞清楚,比什么都重要。这里说的“核心”,就是最终用来启动服务器的那个 jar 文件,它决定了服务器的行为方式、插件/模组的兼容性,以及性能上限。
| 服务端核心 | 适合场景 | 支持插件/模组 | 特点 |
|---|---|---|---|
| 官方原版(Vanilla) | 纯净生存、最小规模 | 不支持 | 最稳定,但没有任何管理工具和优化能力 |
| Paper | 插件服、生存服、小规模多人 | Bukkit/Spigot/Paper 插件 | 社区活跃,性能优化明显,是当前最流行的开服选择 |
| Forge | 模组服(尤其是大型整合包) | Forge Mod | 模组生态最庞大,兼容老版本模组能力强 |
| Fabric | 模组服(轻量、新版本) | Fabric Mod | 启动快、API 轻量,新版 Minecraft 模组首选 |
这里要给新手一个很直观的建议:想装插件,就走Paper 系;想装模组,就走Forge 或 Fabric。插件和模组是两个完全不同的生态,插件像是给服务器加“功能模块”,模组则是直接改游戏本身的玩法逻辑。你没法在 Paper 上跑 Forge 模组,也没法在 Forge 上跑 Bukkit 插件(虽然有桥接方案,但不推荐新手碰)。先把路线定了,后面才不会白折腾。
我自己目前的搭配是:纯净生存服用 Paper,跑整合包用 Forge。Paper 的好处在于社区补充了大量“开服必备插件”——最典型的就是权限管理类 LuckPerms、圈地类 Residence、记录回溯类 CoreProtect。这些插件能帮你把服务器管理得明明白白。说实话,没有这些插件,我根本不敢把服务器开放给朋友以外的玩家,因为熊孩子一锄头下去,你连是谁干的都查不到。
2. Java 环境配置:版本不对,开服脚本第一个报错就是它
《我的世界》Java 版服务器跑在 JVM 上,这意味着你本机必须装一个正确版本的 Java。很多教程说“装个 Java 8 就行”,放在几年前没问题,但现在版本早就变了。我帮朋友排查开服失败时,十次里有八次是 Java 版本和 MC 版本对不上,启动日志直接给你抛一个UnsupportedClassVersionError,或者干脆“找不到主类”。
这里我把 Java 版本对应关系整理成一张表,你照着选就行:
| Minecraft 版本 | 需要 Java 版本 |
|---|---|
| 1.8 ~ 1.16.5 | Java 8(部分新版本服务端可用 Java 11/17) |
| 1.17 ~ 1.17.1 | Java 16 或 17 |
| 1.18 ~ 1.20.4 | Java 17 |
| 1.20.5 及以上 | Java 21 |
注意,这是指服务器端的要求,不是启动器的要求。你客户端用 HMCL、PCL 这些启动器可能自带 Java,但服务器是独立进程,它只认系统里配置的java命令指向哪个版本。
2.1 下载安装:推荐 Temurin 发行版
官网的 Oracle JDK 也能用,但我个人更推荐Adoptium Temurin,也就是以前说的 OpenJDK 发行版。它开源、免费、长期维护,下载时直接选对应系统的安装包:
- Windows:下载
.msi安装包,一路下一步 - Linux:建议用包管理器安装,比如 Ubuntu 上
sudo apt install openjdk-17-jdk - macOS:下载
.pkg安装包,或者用 Homebrew
2.2 配置 JAVA_HOME 和 PATH
Windows 上装完 Java 后,建议手动配置环境变量,这个步骤别跳过。右键“此电脑” → 属性 → 高级系统设置 → 环境变量,然后:
- 新建系统变量
JAVA_HOME,值填 JDK 安装路径,比如C:\Program Files\Eclipse Adoptium\jdk-17.0.10.7 - 编辑
Path,新增一行%JAVA_HOME%\bin - 打开命令行,输入
java -version,看到类似下面的输出就说明环境变量配置成功了:
openjdk version "17.0.10" 2024-01-16 OpenJDK Runtime Environment Temurin-17.0.10+7 (build 17.0.10+7) OpenJDK 64-Bit Server VM Temurin-17.0.10+7 (build 17.0.10+7, mixed mode, sharing)Linux 上也可以用同样的思路写进~/.bashrc或者/etc/profile。这里有个经验:别图省事只装一个 JRE,服务器维护有时需要jcmd、jstack这类 JDK 自带工具,装上完整 JDK 版本能省掉后续一些麻烦。
2.3 版本冲突的典型报错长什么样
如果 Java 版本不对,启动一般会报以下两类错:
Exception in thread "main" java.lang.UnsupportedClassVersionError: ... has been compiled by a more recent version of the Java Runtime:说明 jar 需要更高版本的 Java,你当前版本太老,换新版 Java 即可。Error: Could not find or load main class ...:这种情况除了 jar 文件损坏外,最常见的原因也是 java 版本不兼容,或者java命令根本不在 PATH 里。
开服时我会提前在服务器目录下跑一句java -version,确定当前生效的 Java 版本,再对一下服务端对应的版本要求。这一步 30 秒,能帮你省下半小时查错的时间。
3. 从下载到首次启动:eula、server.properties 和启动脚本的完整解释
环境没问题之后,正式进入开服流程。这一部分看起来简单,但每个文件都有它存在的道理。
3.1 下载服务端 jar 并规划目录
拿 Paper 举例,到官网下载对应 MC 版本的最新构建(比如 1.20.1),得到一个paper-1.20.1-xxx.jar。为了避免以后搞混,我习惯把每个服务器放在独立目录里:
mc-server/ ├── server.jar ├── eula.txt ├── server.properties ├── start.sh ├── mods/ # 模组服务端才会有 ├── plugins/ # 插件服务端才有 ├── world/ # 主世界 ├── world_nether/ ├── world_the_end/ ├── logs/ └── crash-reports/目录规划表面上看是个习惯问题,实际影响很大。以后备份、迁移、清理日志,你都希望它们待在一个固定地方。我见过有人把服务端文件直接扔在桌面,玩了三个月之后整个世界存档混在一堆截图里,想备份都不知道从哪下手。
3.2 首次启动:先改 eula.txt
第一次运行服务端会生成一堆文件,其中就包含eula.txt。默认内容是eula=false,你要手动改成eula=true,这表示同意 Mojang 的用户协议。这个文件不改成 true,服务器启动几秒后就会自动关闭。
启动命令是:
java -Xmx3G -Xms3G -jar server.jar noguinogui是让服务器不弹可视化窗口,只跑命令行界面,这在 Linux 服务器上本来就只能这样,Windows 上我建议也用nogui,资源占用更小。
3.3 server.properties 关键配置项逐个说
服务器跑起来后,最核心的配置文件是server.properties,里面每一项都能直接影响游戏体验。这里挑几个开服时经常要改的说明:
| 配置项 | 推荐值 | 说明 |
|---|---|---|
motd | 自定义文字 | 服务器列表里显示的简介 |
difficulty | normal或hard | 难度设置,后期可在游戏里用命令改 |
gamemode | survival | 默认游戏模式 |
view-distance | 6~10 | 玩家可见区块距离,值越大越吃性能 |
spawn-protection | 0或16 | 出生点保护范围,防止被破坏 |
online-mode | true/false | 是否开启正版验证,盗版客户端进服需要设 false |
max-players | 按服务器配置 | 同时在线人数上限 |
level-seed | 留空或填种子 | 生成地图用的种子,想稳定地图就填固定值 |
white-list | true | 白名单模式,熟人服建议开启 |
我来解释一下最容易踩坑的两项:
第一是online-mode。默认是true,也就是只允许正版玩家进入。如果你和朋友用的是离线启动器/离线模式,必须改成false,否则进服会一直提示“Invalid session”。反过来,如果你的服务器面向全互联网,又想防止别人拿你的 ID 混进来,那就保持true别动。
第二是level-seed。我在开 1.8 版本服务器时往往直接用网上流传的神种子,能够开局就找到大宝寺、村庄和丰富地形。种子的作用是让世界生成完全可复现,填进去之后,删掉旧 world 目录重启,就能生成同样的地图。
3.4 启动脚本:别再每次敲一长串命令了
手动敲java -Xmx3G -Xms3G -jar server.jar nogui太容易出错,尤其启动参数一旦写错,轻则内存分配失败,重则 JVM 直接崩溃。写一个启动脚本是正经做法。
Windows 下建一个start.bat:
@echo off cd /d %~dp0 java -Xms3G -Xmx3G -XX:+UseG1GC -jar server.jar nogui pauseLinux 下建一个start.sh,并加上执行权限:
#!/bin/bash cd "$(dirname "$0")" java -Xms3G -Xmx3G -XX:+UseG1GC -jar server.jar nogui然后:
chmod +x start.sh ./start.sh这里有个我一开始没意识到的细节:-Xms和-Xmx最好设为相同的值。-Xms是 JVM 启动时初始堆内存,-Xmx是最大堆内存,两者一致可以避免 JVM 运行时反复扩容,减少卡顿。小服 3G 起步,如果机器内存紧张,2G 也能跑,但要祈祷人不爆满。
3.5 什么时候算“启动成功”
看到日志里输出类似下面这一行,才算服务端真正就绪:
Done (12.345s)! For help, type "help"在此之前,控制台会先输出一大堆加载日志,包括世界生成、数据包加载、监听端口等。如果卡在“Preparing spawn area”,那是因为服务器正在生成出生点区块,网络差、CPU 弱时会比较久,耐心等。首次启动生成地图的时间可能长达几十秒甚至几分钟,别急着关。
4. Forge 还是 Fabric:模组服路线选择与安装步骤一次跑通
模组是《我的世界》Java 版最迷人的部分之一,但也是新手最容易翻车的地方。安装模组服务端之前,先决定走 Forge 还是 Fabric。很多人问“我该装哪个”,我的回答很简单:看你想玩的模组是哪个生态的。
4.1 Forge 和 Fabric 的差异与选型逻辑
Forge 是老牌模组加载器,从 1.4 时代就开始发展,模组数量最多,尤其是一些大型整合包(比如各种魔法、科技、冒险向的整合包)几乎都是 Forge 系的。但 Forge 的问题在于 API 比较重,对一个追求稳定性的服务器来说,模组之间发生冲突的概率也相应更高。
Fabric 是后来兴起的轻量级模组加载器,设计更现代,启动速度更快,对新版 Minecraft(1.18 以后)的支持更积极。很多轻量客户端增强、性能优化模组(比如 Sodium、Lithium)都是 Fabric 版优先。如果你追求“原版玩法 + 少量增强”,Fabric 更合适。
一句话总结:想玩到的模组只有 Forge 版,就选 Forge;想玩新版本、追求轻量,就选 Fabric。不要两边都装,Forge 和 Fabric 不能同时存在于一个服务端,硬混的结果就是启动时报一堆类加载错误。
4.2 Forge 服务端安装完整步骤
拿 1.20.1 举例。到 Forge 官网找到对应版本的安装器(installer),下载后执行:
java -jar forge-1.20.1-47.2.0-installer.jar --installServer运行完成之后,目录下会生成libraries、mods文件夹,以及run.sh/run.bat。这里要注意:不要用那个 installer jar 直接启动服务器,而是用生成的run.sh或运行forge-1.20.1-47.2.0-universal.jar。如果是生成的脚本,你先改eula.txt为 true,再执行脚本。
接着把下载的模组 jar 放进mods文件夹。启动时服务端会自动加载这些 mods。如果某个模组有前置模组(比如 JEI、Architectury API),也要一并放进 mods,前置缺失会在启动日志里明确标出来:
Missing or unsupported mandatory dependencies: Mod X requires Y看到这类提示,别慌,去 Modrinth 或 CurseForge 上下载对应版本的前置放进 mods 重启即可。
4.3 Fabric 服务端安装完整步骤
Fabric 更简单,下载 Fabric Installer,然后执行:
java -jar fabric-installer.jar server -mcversion 1.20.1 -loader 0.15.11 -dir /path/to/server-mcversion指 Minecraft 版本,-loader指 Fabric Loader 版本(可以用较新版),-dir指定服务端目录。执行完之后,目录下会生成一个 fabric-server-mc.1.20.1-launcher.jar,启动它即可。
装 Fabric 服务端有个特别容易被忽略的点:Fabric API 必须装。很多 Fabric 模组依赖 Fabric API 提供的基础接口,这个不会自动包含在加载器里,需要手动下载对应 MC 版本的 Fabric API jar,放进mods目录。否则你装的很多模组会直接不生效,或者启动时报缺类、缺方法。
4.4 服务端与客户端 Mod 的一致性
开模组服最需要一个清醒认识:客户端和服务端的 mods 必须尽量保持一致。服务器只装服务端需要的 mod,客户端装的 mod 列表也要和服务端对齐。如果你的朋友客户端少装了一个服务端存在的模组,进入服务器时通常会被踢,日志提示 mod 不一致。反过来,客户端多装了服务器没有的模组,一般还能进,但游戏内容可能异常或报奇奇怪怪的错。
我这里的具体操作是:先把服务端 mods 文件夹列表导出成一份文本,发给每个要一起玩的朋友,让他们按照同样列表安装。人少的时候,直接压缩一份客户端 mods 包发到群里,最省心。
5. 让朋友连进来:公网 IP、云服务器与端口放行的实际选择
服务器搭好了,模组也装好了,接下来面临的是最现实的问题:别人怎么连进来?
5.1 最简单的一步:局域网直连
如果你只是想在同一个 WiFi 下和朋友玩,什么都不用配置。服务器启动后,在游戏里“多人游戏” → “添加服务器”,地址填运行服务端那台电脑的局域网 IP(比如192.168.1.100:25565)即可。对绝大多数小圈子来说,这一步已经够了。
但局域网覆盖范围有限,朋友不在同一个网络环境下就进不来,于是需要公网方案。
5.2 家庭宽带的端口映射:只适合有公网 IP 的情况
如果你的路由器有公网 IPv4 地址(可以去路由器后台看 WAN 口 IP 是不是一个真正的公网地址),可以手动做端口映射。步骤大体是:
- 给开服电脑设置静态内网 IP,避免 DHCP 分配的 IP 变化
- 登录路由器后台(通常是
192.168.1.1或192.168.0.1),找到“端口映射”或“虚拟服务器” - 添加规则:外部端口
25565,内部 IP 填开服电脑的局域网 IP,内部端口25565,协议 TCP - 保存后,朋友用你的公网 IP + 端口连接
听起来不复杂,但现实情况是很多家庭宽带的 WAN 口拿到的是运营商 NAT 后的私网地址(比如100.64.x.x),这时候路由器端口映射做得再对,外网还是连不进来。判断方法很简单:路由器 WAN 口显示的 IP 如果以10.、100.64.、172.16.开头,基本就是没戏。
遇到这种情况,我建议别再折腾端口映射了,直接走云服务器方案更省心。
5.3 云服务器开服:最省心、最可控的路径
买一台云服务器是目前最主流的选择。配置参考:
| 玩家数量 | 推荐配置 | 内存 |
|---|---|---|
| 3 ~ 8 人 | 2 核 CPU | 3G ~ 4G |
| 10 ~ 20 人 | 4 核 CPU | 6G ~ 8G |
| 20 人以上或大型整合包 | 4 核+ CPU | 8G 以上 |
《我的世界》服务器对 CPU 单核性能和内存容量要求比较高,带宽反而不挑,5Mbps 已经非常充裕。系统我一般选 Ubuntu 20.04 或 Debian 11,比 Windows Server 省资源,更适合长期运行。
购买之后有几个必做步骤:一是安全组放行端口。云服务商控制台里都有“安全组”或“防火墙”选项,需要添加入方向规则放行 TCP25565,否则游戏端口会被云厂商的防火墙挡在外面。二是系统防火墙(ufw)也要放行,执行:
sudo ufw allow 25565/tcp sudo ufw enable这两步漏掉任何一个,外部玩家就连不上。我见过太多人明明服务端显示 Done,本地也能进,但朋友就是连不上,最后发现是安全组没放行。
5.4 服务器进程守护:防止 SSH 断开服务就挂
在云服务器上跑 MC 服务端,如果直接在前台运行,你关闭 SSH 连接时服务可能会被杀掉。这里推荐用screen或tmux,简单可靠:
apt install screen -y screen -S mc ./start.sh之后想重新连上服务器控制台,执行screen -r mc就能恢复。如果想更正规一点,写一个 systemd service 文件让服务随开机自启、崩溃自动重启,对长期运行的服务器来说更友好。我通常会在/etc/systemd/system/mc.service写这样一个最小化配置:
[Unit] Description=Minecraft Server After=network.target [Service] WorkingDirectory=/opt/mc-server ExecStart=/usr/bin/java -Xms4G -Xmx4G -jar server.jar nogui Restart=on-failure [Install] WantedBy=multi-user.target写完执行systemctl daemon-reload,然后用systemctl start mc启动,用journalctl -u mc -f查看实时日志。
6. 性能优化与崩溃排查:JVM 参数、Paper 配置和 Mod 冲突的实战经验
开服到最后阶段,真正的门槛是“稳定”和“流畅”。下面这些内容都是我实际踩坑换来的,按优先级给你排个序。
6.1 JVM 参数优化:把垃圾回收卡顿压下去
MC 服务器基于 JVM,垃圾回收(GC)导致的卡顿是绕不开的话题。默认 JVM 参数下,每隔一段时间 GC 暂停就可能导致全服玩家瞬移(俗称“飘回”),这就是热词里说的“垃圾回收卡顿”。缓解办法是使用 G1GC 收集器,并优化相关参数。
我常用的启动参数长这样:
java -Xms4G -Xmx4G -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 \ -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch \ -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M \ -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 \ -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 \ -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 \ -XX:MaxTenuringThreshold=1 -jar server.jar nogui这套参数是社区大量服务器验证过的方案,不一定要逐项理解,但照抄能明显感觉到 GC 卡顿变少。注意-Xms和-Xmx一定要按实际机器内存调整,比如 4G 内存的服务器分配 3G 给 MC 比较稳妥,太多会挤压系统和其他进程,太少会频繁 GC。
我自己测试时有个体会:加不加-XX:+AlwaysPreTouch,启动时内存占用感受差别很大。这个参数会强制 JVM 启动时就申请并触碰所有堆内存页,好处是启动后运行更稳定,代价是启动稍慢,但对服务器来说完全值得。
6.2 Paper 配置层面的降载优化
插件服用 Paper,除了内核自带的优化,还有一些开关值得调。Paper 的配置分散在config/paper-global.yml和config/paper-world-defaults.yml里,常用几个优化项:
- 降低实体激活范围:
entities.activation-range,把“玩家周围多少格内的实体才参与 tick”调小,能显著降低 CPU 压力。 - 限制每 tick 自动保存的区块数:
chunks.max-auto-save-chunks-per-tick,防止自动保存瞬间造成全服卡顿。 - 调整 view-distance:这个在
server.properties里,从默认的 10 降到 6,玩家视野会近一些,但对小服来说流畅度提升立竿见影。
不要看到“优化”就把参数往死里调,调太低会导致刷怪范围变小、红石机械失效、玩家体验变差。我一般用“逐项改,重启后实际跑一晚观察”的方式确认效果,而不是一次改一堆,改完都不知道是哪个参数起的作用。
6.3 模组服崩溃:先读 crash-reports,再想别的
模组服启动崩溃时,不要盲目重下模组。服务端目录下的crash-reports文件夹会生成以时间命名的.txt文件,用文本编辑器打开,直接跳到靠后位置的Caused by:段落,那才是崩溃的核心原因。
举两个最常见的例子。如果看到Missing or unsupported mandatory dependencies,说明某个模组的前置没装或版本不对,去 Modrinth / CurseForge 核对依赖关系,下载正确版本。如果看到某种Mixins相关的冲突,十有八九是两个模组对同一个游戏逻辑做了不兼容的修改,常见于 Forge 和 Fabric 混装,或者两个模组都改同一个类的同一个方法。这种只能通过暂时移除部分模组,做“二分法”排查——把 mods 对半分,每次启动一批,很快就能锁定问题模组范围。
6.4 常见启动与连接问题对照表
下面这个表基本涵盖了开服过程中 70% 以上的新手问题:
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
启动报Could not reserve enough space | -Xmx超过物理内存 | 调低内存参数 |
启动报UnsupportedClassVersionError | Java 版本过低 | 按 MC 版本安装对应 Java |
启动报Unable to access jarfile | 路径不对或 jar 名写错 | 检查脚本路径和文件名 |
| 服务器 Done 但外网连不上 | 安全组/防火墙未放行 25565 | 检查云安全组和 ufw |
进服提示Invalid session | online-mode 与客户端不匹配 | 按是否正版调整online-mode |
| 客户端能进但图块不加载/卡加载 | 服务器 view-distance 太小或带宽不足 | 适当调大 view-distance,升级配置 |
| 模组服进服被踢,提示 mod 不一致 | 客户端与服务器 mod 列表不一致 | 统一 mods 列表和版本 |
| 服务端定期卡顿、TPS 掉到 10 以下 | 实体过多/红石机械过多/GC 问题 | 用优化插件定位,再调参数 |
6.5 备份:比优化更该先做的一件事
最后说一个被我朋友提醒了很多次才重视起来的事:备份。很多服务器坚持了几个月,结果一次误删世界文件夹、一次磁盘故障,所有存档归零,那感觉比服务器被熊孩子炸掉还难受。
Linux 上我每周用 crontab 定时打包 world 目录,保留最近 7 份:
0 4 * * * /opt/mc-server/backup.shbackup.sh里写:
#!/bin/bash BACKUP_DIR=/opt/mc-backups WORLD_DIR=/opt/mc-server/world tar -czf "$BACKUP_DIR/world-$(date +\%F-\%H\%M).tar.gz" -C /opt/mc-server world ls -t $BACKUP_DIR/world-*.tar.gz | tail -n +8 | xargs -r rm备份时间选在凌晨人少的时候,减少对在线玩家的影响。Windows 下可以用计划任务跑 robocopy 或直接用压缩工具定时打包。备份这件事,说难不难,但没做的人绝对会后悔。
根据我自己的开服经验,很多问题看起来吓人,实际上根源都很简单——Java 版本不对、防火墙没放行、模组版本不匹配、内存分配不够,翻来覆去就这几类。只要按顺序排查,大多数服务都能在十几分钟内恢复。开服这条路,最重要的其实是耐心:先让一个小圈子稳定玩起来,再根据实际需求逐步加模组、加插件、调优化,远比一开始就想搞一个“完美服”靠谱得多。