MC 九年老玩家的开服初体验
最近想试一试 MC 开服怎么做,这次就在我的 archlinux 的工作站上面试一试。
关于 Java
我并没有学过 java 语言。MC 不同版本经常需要不同的 java 版本,这往往很麻烦。但 archlinux 有一个非常优雅的 java 版本管理,参考官方 wiki 页面 。
关键在于这句话:
Arch Linux officially supports the open source OpenJDK versions 8, 11, 17, 21, and 25 — Long-Term Support (LTS) versions. All these JVMs can be installed without conflict and switched between using helper script archlinux-java (installed with java-runtime-common package). Several other Java environments are available in Arch User Repository but are not officially supported.
通过下面的命令不同版本的 OpenJDK
sudo pacman -S jdk-openjdk
具体细节看第 1.1 节。
通过下面的命令下载 archlinux-java 脚本工具
sudo pacman -S java-runtime-common
该工具也会在你使用 pacman 下载任何 java 的时候被自动拉取。 具体如何使用则具体在第二节 Switching between JVM。
原版服
参考链接
- https://minecraft.wiki/w/Tutorial:Setting_up_a_Java_Edition_server#Starting_up_the_server
- 主要参考其中的 Starting up the server 章节
开服姿势
Step0: 确认设备配置合适,确认 Java 装好,确认建立好了新的目录(mkdir)。
Step1: 下载服务器文件,你可以将其重命名为 server.jar ,我们后面就称这个文件是 server.jar
可以去官方网站 https://www.minecraft.net/en-us/download/server 下载最新版的服务器文件,这个网站里面右键 minecraft serverxxxxxx 的超链接即可下载到服务器文件,如果服务器没有 GUI 则复制链接地址然后 wget 即可。

❯ wget -O server.jar https://piston-data.mojang.com/v1/objects/64bb6d763bed0a9f1d632ec347938594144943ed/server.jar
--2026-01-23 01:35:16-- https://piston-data.mojang.com/v1/objects/64bb6d763bed0a9f1d632ec347938594144943ed/server.jar
Loaded CA certificate '/etc/ssl/certs/ca-certificates.crt'
Resolving piston-data.mojang.com (piston-data.mojang.com)... 13.107.246.59, 13.107.213.59
Connecting to piston-data.mojang.com (piston-data.mojang.com)|13.107.246.59|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 56327581 (54M) [application/octet-stream]
Saving to: ‘server.jar’
server.jar 100%[================================>] 53.72M 11.1MB/s in 5.1s
2026-01-23 01:35:21 (10.6 MB/s) - ‘server.jar’ saved [56327581/56327581]
❯ ls
server.jar
Step2: 运行服务器文件,生成并修改配置文件。
运行下面的命令,这条命令一定会失败,这是用来生成一些配置文件的。
java -jar server.jar nogui
运行后会产生一些其它文件,重点关注两个:
eula.txt: 要进入这个文件把里面的false改为true,这其实就是所谓的 “用户条款”,考虑到没有 GUI,Mojang 就用这种方式来让你确认 “用户条款” 。server.properties: 这是一个文本文件,里面有很多服务器的配置开关。下面说一些重要的difficulty: 即游戏难度,默认是easy,想玩生电的话就要改为hardlevel-name: 服务器存档,默认是·world,启动前可以通过该这个来切换存档server-port: 开放端口,默认是25565online-mode: 是否开启正版验证,默认是truewhite-list: 是开白名单模式,默认是false,开了之后只有白名单列表的玩家才允许加入max-tick-time: 卡顿看门狗,如果服务卡顿超过设定时间,则强制关闭服务器。默认是60000(一分钟),这个建议调高一点。pause-when-empty-seconds: 服务器空闲(没玩家上号)一段时间后,服务器会自动暂停以节能,默认是60,设为-1以永不暂停。
❯ java -jar server.jar
Unpacking 1.21.11/server-1.21.11.jar (versions:1.21.11) to versions/1.21.11/server-1.21.11.jar
Unpacking at/yawk/lz4/lz4-java/1.8.1/lz4-java-1.8.1.jar (libraries:at.yawk.lz4:lz4-java:1.8.1) to libraries/at/yawk/lz4/lz4-java/1.8.1/lz4-java-1.8.1.jar
Unpacking com/azure/azure-json/1.4.0/azure-json-1.4.0.jar (libraries:com.azure:azure-json:1.4.0) to libraries/com/azure/azure-json/1.4.0/azure-json-1.4.0.jar
Unpacking com/github/oshi/oshi-core/6.9.0/oshi-core-6.9.0.jar (libraries:com.github.oshi:oshi-core:6.9.0) to libraries/com/github/oshi/oshi-core/6.9.0/oshi-core-6.9.0.jar
Unpacking com/google/code/gson/gson/2.13.2/gson-2.13.2.jar (libraries:com.google.code.gson:gson:2.13.2) to libraries/com/google/code/gson/gson/2.13.2/gson-2.13.2.jar
Unpacking com/google/guava/failureaccess/1.0.3/failureaccess-1.0.3.jar (libraries:com.google.guava:failureaccess:1.0.3) to libraries/com/google/guava/failureaccess/1.0.3/failureaccess-1.0.3.jar
Unpacking com/google/guava/guava/33.5.0-jre/guava-33.5.0-jre.jar (libraries:com.google.guava:guava:33.5.0-jre) to libraries/com/google/guava/guava/33.5.0-jre/guava-33.5.0-jre.jar
Unpacking com/microsoft/azure/msal4j/1.23.1/msal4j-1.23.1.jar (libraries:com.microsoft.azure:msal4j:1.23.1) to libraries/com/microsoft/azure/msal4j/1.23.1/msal4j-1.23.1.jar
Unpacking com/mojang/authlib/7.0.61/authlib-7.0.61.jar (libraries:com.mojang:authlib:7.0.61) to libraries/com/mojang/authlib/7.0.61/authlib-7.0.61.jar
Unpacking com/mojang/brigadier/1.3.10/brigadier-1.3.10.jar (libraries:com.mojang:brigadier:1.3.10) to libraries/com/mojang/brigadier/1.3.10/brigadier-1.3.10.jar
unpacking com/mojang/datafixerupper/9.0.19/datafixerupper-9.0.19.jar (libraries:com.mojang:datafixerupper:9.0.19) to libraries/com/mojang/datafixerupper/9.0.19/datafixerupper-9.0.19.jar
Unpacking com/mojang/jtracy/1.0.37/jtracy-1.0.37.jar (libraries:com.mojang:jtracy:1.0.37) to libraries/com/mojang/jtracy/1.0.37/jtracy-1.0.37.jar
Unpacking com/mojang/logging/1.6.11/logging-1.6.11.jar (libraries:com.mojang:logging:1.6.11) to libraries/com/mojang/logging/1.6.11/logging-1.6.11.jar
Unpacking commons-io/commons-io/2.20.0/commons-io-2.20.0.jar (libraries:commons-io:commons-io:2.20.0) to libraries/commons-io/commons-io/2.20.0/commons-io-2.20.0.jar
Unpacking io/netty/netty-buffer/4.2.7.Final/netty-buffer-4.2.7.Final.jar (libraries:io.netty:netty-buffer:4.2.7.Final) to libraries/io/netty/netty-buffer/4.2.7.Final/netty-buffer-4.2.7.Final.jar
Unpacking io/netty/netty-codec-base/4.2.7.Final/netty-codec-base-4.2.7.Final.jar (libraries:io.netty:netty-codec-base:4.2.7.Final) to libraries/io/netty/netty-codec-base/4.2.7.Final/netty-codec-base-4.2.7.Final.jar
Unpacking io/netty/netty-codec-compression/4.2.7.Final/netty-codec-compression-4.2.7.Final.jar (libraries:io.netty:netty-codec-compression:4.2.7.Final) to libraries/io/netty/netty-codec-compression/4.2.7.Final/netty-codec-compression-4.2.7.Final.jar
Unpacking io/netty/netty-codec-http/4.2.7.Final/netty-codec-http-4.2.7.Final.jar (libraries:io.netty:netty-codec-http:4.2.7.Final) to libraries/io/netty/netty-codec-http/4.2.7.Final/netty-codec-http-4.2.7.Final.jar
Unpacking io/netty/netty-common/4.2.7.Final/netty-common-4.2.7.Final.jar (libraries:io.netty:netty-common:4.2.7.Final) to libraries/io/netty/netty-common/4.2.7.Final/netty-common-4.2.7.Final.jar
Unpacking io/netty/netty-handler/4.2.7.Final/netty-handler-4.2.7.Final.jar (libraries:io.netty:netty-handler:4.2.7.Final) to libraries/io/netty/netty-handler/4.2.7.Final/netty-handler-4.2.7.Final.jar
Unpacking io/netty/netty-resolver/4.2.7.Final/netty-resolver-4.2.7.Final.jar (libraries:io.netty:netty-resolver:4.2.7.Final) to libraries/io/netty/netty-resolver/4.2.7.Final/netty-resolver-4.2.7.Final.jar
Unpacking io/netty/netty-transport/4.2.7.Final/netty-transport-4.2.7.Final.jar (libraries:io.netty:netty-transport:4.2.7.Final) to libraries/io/netty/netty-transport/4.2.7.Final/netty-transport-4.2.7.Final.jar
Unpacking io/netty/netty-transport-classes-epoll/4.2.7.Final/netty-transport-classes-epoll-4.2.7.Final.jar (libraries:io.netty:netty-transport-classes-epoll:4.2.7.Final) to libraries/io/netty/netty-transport-classes-epoll/4.2.7.Final/netty-transport-classes-epoll-4.2.7.Final.jar
Unpacking io/netty/netty-transport-classes-kqueue/4.2.7.Final/netty-transport-classes-kqueue-4.2.7.Final.jar (libraries:io.netty:netty-transport-classes-kqueue:4.2.7.Final) to libraries/io/netty/netty-transport-classes-kqueue/4.2.7.Final/netty-transport-classes-kqueue-4.2.7.Final.jar
Unpacking io/netty/netty-transport-native-epoll/4.2.7.Final/netty-transport-native-epoll-4.2.7.Final-linux-x86_64.jar (libraries:io.netty:netty-transport-native-epoll:4.2.7.Final:linux-x86_64) to libraries/io/netty/netty-transport-native-epoll/4.2.7.Final/netty-transport-native-epoll-4.2.7.Final-linux-x86_64.jar
Unpacking io/netty/netty-transport-native-epoll/4.2.7.Final/netty-transport-native-epoll-4.2.7.Final-linux-aarch_64.jar (libraries:io.netty:netty-transport-native-epoll:4.2.7.Final:linux-aarch_64) to libraries/io/netty/netty-transport-native-epoll/4.2.7.Final/netty-transport-native-epoll-4.2.7.Final-linux-aarch_64.jar
Unpacking io/netty/netty-transport-native-kqueue/4.2.7.Final/netty-transport-native-kqueue-4.2.7.Final-osx-x86_64.jar (libraries:io.netty:netty-transport-native-kqueue:4.2.7.Final:osx-x86_64) to libraries/io/netty/netty-transport-native-kqueue/4.2.7.Final/netty-transport-native-kqueue-4.2.7.Final-osx-x86_64.jar
Unpacking io/netty/netty-transport-native-kqueue/4.2.7.Final/netty-transport-native-kqueue-4.2.7.Final-osx-aarch_64.jar (libraries:io.netty:netty-transport-native-kqueue:4.2.7.Final:osx-aarch_64) to libraries/io/netty/netty-transport-native-kqueue/4.2.7.Final/netty-transport-native-kqueue-4.2.7.Final-osx-aarch_64.jar
Unpacking io/netty/netty-transport-native-unix-common/4.2.7.Final/netty-transport-native-unix-common-4.2.7.Final.jar (libraries:io.netty:netty-transport-native-unix-common:4.2.7.Final) to libraries/io/netty/netty-transport-native-unix-common/4.2.7.Final/netty-transport-native-unix-common-4.2.7.Final.jar
Unpacking it/unimi/dsi/fastutil/8.5.18/fastutil-8.5.18.jar (libraries:it.unimi.dsi:fastutil:8.5.18) to libraries/it/unimi/dsi/fastutil/8.5.18/fastutil-8.5.18.jar
Unpacking net/java/dev/jna/jna/5.17.0/jna-5.17.0.jar (libraries:net.java.dev.jna:jna:5.17.0) to libraries/net/java/dev/jna/jna/5.17.0/jna-5.17.0.jar
Unpacking net/java/dev/jna/jna-platform/5.17.0/jna-platform-5.17.0.jar (libraries:net.java.dev.jna:jna-platform:5.17.0) to libraries/net/java/dev/jna/jna-platform/5.17.0/jna-platform-5.17.0.jar
Unpacking net/sf/jopt-simple/jopt-simple/5.0.4/jopt-simple-5.0.4.jar (libraries:net.sf.jopt-simple:jopt-simple:5.0.4) to libraries/net/sf/jopt-simple/jopt-simple/5.0.4/jopt-simple-5.0.4.jar
Unpacking org/apache/commons/commons-lang3/3.19.0/commons-lang3-3.19.0.jar (libraries:org.apache.commons:commons-lang3:3.19.0) to libraries/org/apache/commons/commons-lang3/3.19.0/commons-lang3-3.19.0.jar
Unpacking org/apache/logging/log4j/log4j-api/2.25.2/log4j-api-2.25.2.jar (libraries:org.apache.logging.log4j:log4j-api:2.25.2) to libraries/org/apache/logging/log4j/log4j-api/2.25.2/log4j-api-2.25.2.jar
Unpacking org/apache/logging/log4j/log4j-core/2.25.2/log4j-core-2.25.2.jar (libraries:org.apache.logging.log4j:log4j-core:2.25.2) to libraries/org/apache/logging/log4j/log4j-core/2.25.2/log4j-core-2.25.2.jar
Unpacking org/apache/logging/log4j/log4j-slf4j2-impl/2.25.2/log4j-slf4j2-impl-2.25.2.jar (libraries:org.apache.logging.log4j:log4j-slf4j2-impl:2.25.2) to libraries/org/apache/logging/log4j/log4j-slf4j2-impl/2.25.2/log4j-slf4j2-impl-2.25.2.jar
Unpacking org/joml/joml/1.10.8/joml-1.10.8.jar (libraries:org.joml:joml:1.10.8) to libraries/org/joml/joml/1.10.8/joml-1.10.8.jar
Unpacking org/jspecify/jspecify/1.0.0/jspecify-1.0.0.jar (libraries:org.jspecify:jspecify:1.0.0) to libraries/org/jspecify/jspecify/1.0.0/jspecify-1.0.0.jar
Unpacking org/slf4j/slf4j-api/2.0.17/slf4j-api-2.0.17.jar (libraries:org.slf4j:slf4j-api:2.0.17) to libraries/org/slf4j/slf4j-api/2.0.17/slf4j-api-2.0.17.jar
Starting net.minecraft.server.Main
[01:59:58] [ServerMain/ERROR]: Failed to load properties from file: server.properties
java.nio.file.NoSuchFileException: server.properties
at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:92)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:106)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)
at java.base/sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:261)
at java.base/java.nio.file.Files.newByteChannel(Files.java:380)
at java.base/java.nio.file.Files.newByteChannel(Files.java:432)
at java.base/java.nio.file.spi.FileSystemProvider.newInputStream(FileSystemProvider.java:420)
at java.base/java.nio.file.Files.newInputStream(Files.java:160)
at asc.b(SourceFile:62)
at arz.a(SourceFile:154)
at asa.<init>(SourceFile:12)
at net.minecraft.server.Main.main(SourceFile:115)
at net.minecraft.bundler.Main.lambda$run$0(Main.java:54)
at java.base/java.lang.Thread.run(Thread.java:1583)
[01:59:58] [ServerMain/WARN]: Failed to load eula.txt
[01:59:58] [ServerMain/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.
❯ ls
libraries logs versions eula.txt server.jar server.properties
其实运行方法,在官方的服务器文件下载页面里面其实就说了,就在下载链接的正下方,有一行命令,我们来看看这个命令是什么意思。
java -Xmx1024M -Xms1024M -jar minecraft_server.1.21.11.jar nogui
- 感觉
-jar是核心参数,告诉 java 运行一个 JAR 包,也就是刚刚下载下来的服务器文件。 minecraft_server.1.21.11.jar则是服务器文件,这应该是默认下载产生的文件的名字。-Xms1024M指的是初始内存,即程序启动时申请的内存大小。如果不输入该参数,默认大概为总内存的 1/64。-Xmx1024M指的是最大内存,即运行过程中允许占用的最大内存。如果不输入该参数,默认大概为总内存的 1/4。nogui指的是不开 GUI,很多服务器不需要 GUI。
显然官方指定的内存大小基本上是不够畅玩的。。。
step3: MC,启动!
上面的配置文件设置好之后,就可以启动了。(其实默认配置也可以启动)。运行
java -Xmx... -Xms... -jar server.jar nogui
即可启动。建议配置一个 start.sh 脚本里面写一个带具体 java 参数的命令来代为启动。
❯ nvim eula.txt
❯ cat eula.txt
#By changing the setting below to TRUE you are indicating your agreement to our EULA (https://aka.ms/MinecraftEULA).
#Fri Jan 23 01:59:58 CST 2026
eula=true
❯ java -jar server.jar
Starting net.minecraft.server.Main
[02:19:22] [ServerMain/INFO]: Environment: Environment[sessionHost=https://sessionserver.mojang.com, servicesHost=https://api.minecraftservices.com, profilesHost=https://api.mojang.com, name=PROD]
[02:19:23] [ServerMain/INFO]: No existing world data, creating new world
[02:19:24] [ServerMain/INFO]: Loaded 1470 recipes
[02:19:24] [ServerMain/INFO]: Loaded 1584 advancements
[02:19:24] [Server thread/INFO]: Starting minecraft server version 1.21.11
[02:19:24] [Server thread/INFO]: Loading properties
[02:19:24] [Server thread/INFO]: Default game type: SURVIVAL
[02:19:24] [Server thread/INFO]: Generating keypair
[02:19:24] [Server thread/INFO]: Starting Minecraft server on *:25565
[02:19:24] [Server thread/INFO]: Preparing level "world"
[02:19:25] [Server thread/INFO]: Selecting global world spawn...
[02:19:27] [Server thread/INFO]: Loading 0 persistent chunks...
[02:19:27] [Server thread/INFO]: Preparing spawn area: 100%
[02:19:27] [Server thread/INFO]: Time elapsed: 2365 ms
[02:19:27] [Server thread/INFO]: Done (2.703s)! For help, type "help"
当看到 “Done” 的时候,服务器已经开启了。查询你的服务器的公网 IP,然后发送给玩家们,他们用 <你的公网ip>:25565 即可登录。
在这个页面,你也可以输入信息,效果几乎等效于你再游戏里开作弊模式输入 / + 相应的内容。例如你可以在这里直接输入 seed 查询地图种子,输入 op <player-id> 来指定管理员权限,输入 deop <player-id> 来取消管理员权限。
输入 stop 来关闭服务器。
开服的正确姿势
上面说了开服的流程,但是有一些东西需要注意。
我不想开最新版的服务器
Mojang 官方只提供最新版本服务器文件的下载地址。想要下载其它版本的纯原版服务器文件,有几个办法
- 从第三方网站 https://mcversions.net 下载
- 从官方启动器下载,打开官方启动器,点进 “配置” 选项卡,选择 “新配置”,然后里面有一个小小的下载服务器的地址链接。如下图所示

服务端要后台运行!
上一小节我说用 java -jar server.jar 这个命令即可开服。这当然没错。可是服务器是要长期运行的。你运行了这个命令后,如果关闭所处的 terminal ,命令作为 terminal 的子进程当然会被关闭,服务器也被关闭了。
推荐使用终端复用器 tmux,archlinux 上面可以直接使用 pacman 下载。省流用法如下:
运行
tmux new -s mc
来开启一个新“会话”,屏幕底部会多一个绿色的状态来标志成功进入会话。
在这个会话栏里面启动服务器,运行 java -jar server.jar 或者你编写的替代脚本。
按下 Ctrl + b ,然后按下 d 离开会话,屏幕上会显式一个 [detached],意味着会话已经后台运行。此时关闭所处的终端也不会导致服务器被关闭。
运行
tmux attach -t mc
回到会话中,你可以在此操作服务器。
运行 exit 可以退出当前会话。其它 tmux 操作请自行查找。
模组服
以 neoforge 为例,可以在
https://docs.neoforged.net/user/docs/server/
看到开服的方法,果然离开了 Mojang 官方才知道别的地方都有好文档。顺带一提,模组文件和客户端文件是一样的,只需要输入不同的参数即可。按照提示,我们先在 https://neoforged.net/ 选择想要的版本,然后下载。
❯ wget -O server.jar https://maven.neoforged.net/releases/net/neoforged/neoforge/21.4.156/neoforge-21.4.156-installer.jar
--2026-01-23 11:51:17-- https://maven.neoforged.net/releases/net/neoforged/neoforge/21.4.156/neoforge-21.4.156-installer.jar
Loaded CA certificate '/etc/ssl/certs/ca-certificates.crt'
Resolving maven.neoforged.net (maven.neoforged.net)... 156.146.44.89, 84.17.57.26
Connecting to maven.neoforged.net (maven.neoforged.net)|156.146.44.89|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7223039 (6.9M) [application/java-archive]
Saving to: ‘server.jar’
server.jar 100%[====================================================================================================>] 6.89M 8.06MB/s in 0.9s
2026-01-23 11:51:18 (8.06 MB/s) - ‘server.jar’ saved [7223039/7223039]
❯ ls
server.jar
然后运行
java -jar server.jar --installServer
产生配置文件。
❯ java -jar server.jar --installServer
Outputting log to file server.jar.log
JVM info: Arch Linux - 21.0.10 - 21.0.10+7
java.net.preferIPv4Stack=true
Current Time: 23/01/2026 11:52:40
Host: maven.neoforged.net [84.17.57.26, 156.146.44.89]
Host: libraries.minecraft.net [13.107.246.73, 13.107.213.73]
Host: launchermeta.mojang.com [13.107.213.59, 13.107.246.59]
Host: piston-meta.mojang.com [13.107.213.59, 13.107.246.59]
Host: sessionserver.mojang.com [13.107.246.59, 13.107.213.59]
Found java version 21.0.10
Target Directory: .
Following redirect: https://neoforged.net/mirrorlist.json
Considering Minecraft server jar
Downloading library from https://piston-meta.mojang.com/v1/packages/6eae5d0cb40a56afb56032a4a502f87343c63cc9/1.21.4.json
Download completed: Checksum validated.
Downloading library from https://piston-data.mojang.com/v1/objects/4707d00eb834b446575d89a61a11b5d548d8c001/server.jar
Download completed: Checksum validated.
Downloading libraries
Found 1 additional library directories
Considering library net.neoforged.fancymodloader:earlydisplay:6.0.18
Downloading library from https://maven.neoforged.net/releases/net/neoforged/fancymodloader/earlydisplay/6.0.18/earlydisplay-6.0.18.jar
Download completed: Checksum validated.
Considering library net.neoforged.fancymodloader:loader:6.0.18
Downloading library from https://maven.neoforged.net/releases/net/neoforged/fancymodloader/loader/6.0.18/loader-6.0.18.jar
Download completed: Checksum validated.
Considering library net.neoforged.accesstransformers:at-modlauncher:11.0.2
Downloading library from https://maven.neoforged.net/releases/net/neoforged/accesstransformers/at-modlauncher/11.0.2/at-modlauncher-11.0.2.jar
Download completed: Checksum validated.
Considering library net.neoforged:accesstransformers:11.0.2
Downloading library from https://maven.neoforged.net/releases/net/neoforged/accesstransformers/11.0.2/accesstransformers-11.0.2.jar
Download completed: Checksum validated.
Considering library net.neoforged:bus:8.0.5
Downloading library from https://maven.neoforged.net/releases/net/neoforged/bus/8.0.5/bus-8.0.5.jar
Download completed: Checksum validated.
Considering library net.neoforged:coremods:7.0.3
...
net/minecraft/world/ticks/WorldGenTickAccess.class
net/minecraft/world/ticks/package-info.class
===============================================================================
Processor: net.neoforged.installertools:binarypatcher
MainClass: net.neoforged.binarypatcher.ConsoleTool
Classpath:
/home/shwan/mc-server/neoforge/./libraries/net/neoforged/installertools/binarypatcher/2.1.2/binarypatcher-2.1.2-fatjar.jar
/home/shwan/mc-server/neoforge/./libraries/net/neoforged/installertools/binarypatcher/2.1.2/binarypatcher-2.1.2-fatjar.jar
Args: --clean, /home/shwan/mc-server/neoforge/./libraries/net/minecraft/server/1.21.4-20241203.161809/server-1.21.4-20241203.161809-srg.jar, --output, /home/shwan/mc-server/neoforge/./libraries/net/neoforged/neoforge/21.4.156/neoforge-21.4.156-server.jar, --apply, /tmp/neoforge_installer191771433557844724/data/server.lzma
Applying:
Clean: /home/shwan/mc-server/neoforge/./libraries/net/minecraft/server/1.21.4-20241203.161809/server-1.21.4-20241203.161809-srg.jar
Output: /home/shwan/mc-server/neoforge/./libraries/net/neoforged/neoforge/21.4.156/neoforge-21.4.156-server.jar
KeepData: false
Unpatched: false
Pack200: false
Legacy: false
Loading patches file: /tmp/neoforge_installer191771433557844724/data/server.lzma
Processor: net.neoforged.installertools:binarypatcher: Loading patch files
Processor: net.neoforged.installertools:binarypatcher: Patching input
Processor: net.neoforged.installertools:binarypatcher: Adding new files
The server installed successfully
You can delete this installer file now if you wish
❯ ls
libraries run.bat run.sh server.jar server.jar.log user_jvm_args.txt
这里面有一个 user_jvm_args.txt 文件似乎可以固定 java 参数。查看 run.sh 的内容就可以知道是怎么回事。修改一下 user_jvm_args.txt 里面的参数,然后记得查看一下 run.sh 里面是否有需要调整的地方 (主要是 nogui 选项,这里面的注释写得很清楚了)。
❯ cat user_jvm_args.txt
# Xmx and Xms set the maximum and minimum RAM usage, respectively.
# They can take any number, followed by an M or a G.
# M means Megabyte, G means Gigabyte.
# For example, to set the maximum to 3GB: -Xmx3G
# To set the minimum to 2.5GB: -Xms2500M
# A good default for a modded server is 4GB.
# Uncomment the next line to set it.
-Xmx8G
❯ cat run.sh
#!/usr/bin/env sh
# Forge requires a configured set of both JVM and program arguments.
# Add custom JVM arguments to the user_jvm_args.txt
# Add custom program arguments {such as nogui} to this file in the next line before the "$@" or
# pass them to this script directly
java @user_jvm_args.txt @libraries/net/neoforged/neoforge/21.4.156/unix_args.txt nogui "$@"
然后运行 run.sh 文件,这才开始试图开启服务器,这时会和之前一样产生 eula.txt 文件让你勾选。
❯ ./run.sh
[12:17:47.055] [main/INFO] [Launcher/MODLAUNCHER]: ModLauncher running: args [--launchTarget, neoforgeserver, --fml.neoForgeVersion, 21.4.156, --fml.fmlVersion, 6.0.18, --fml.mcVersion, 1.21.4, --fml.neoFormVersion, 20241203.161809, nogui]
[12:17:47.057] [main/INFO] [Launcher/MODLAUNCHER]: JVM identified as Arch Linux OpenJDK 64-Bit Server VM 21.0.10+7
[12:17:47.059] [main/INFO] [Launcher/MODLAUNCHER]: ModLauncher 11.0.4+main.d2e20e43 starting: java version 21.0.10 by Arch Linux; OS Linux arch amd64 version 6.18.4-arch1-1
[12:17:47.159] [main/INFO] [loading.ImmediateWindowHandler/]: ImmediateWindowProvider not loading because launch target is neoforgeserver
[12:17:47.220] [main/INFO] [mixin/]: SpongePowered MIXIN Subsystem Version=0.8.7 Source=union:/home/shwan/mc-server/neoforge/libraries/net/fabricmc/sponge-mixin/0.15.2+mixin.0.8.7/sponge-mixin-0.15.2+mixin.0.8.7.jar%2385!/ Service=ModLauncher Env=SERVER
[12:17:47.540] [main/INFO] [loading.moddiscovery.ModDiscoverer/SCAN]: Found mod file "server-1.21.4-20241203.161809-srg.jar" [locator: production server provider +net.neoforged:neoforge:21.4.156:server]
[12:17:47.563] [main/INFO] [loading.moddiscovery.ModDiscoverer/SCAN]: Found mod file "neoforge-21.4.156-universal.jar" [locator: PathBasedLocator[name=neoforge, paths=[libraries/net/neoforged/neoforge/21.4.156/neoforge-21.4.156-universal.jar]], reader: mod manifest]
[12:17:47.686] [main/INFO] [loading.moddiscovery.locators.JarInJarDependencyLocator/]: Found 2 dependencies adding them to mods collection
[12:17:47.687] [main/INFO] [loading.moddiscovery.ModDiscoverer/SCAN]: Found gamelibrary file "mixinextras-neoforge-0.5.0.jar" [parent: neoforge-21.4.156-universal.jar, locator: jarinjar, reader: mod manifest]
[12:17:47.687] [main/INFO] [loading.moddiscovery.ModDiscoverer/SCAN]: Found library file "net.neoforged.neoforge-coremods-21.4.156.jar" [parent: neoforge-21.4.156-universal.jar, locator: jarinjar, reader: mod manifest]
[12:17:47.689] [main/INFO] [loading.moddiscovery.ModDiscoverer/]:
Mod List:
Name Version (Mod Id)
Minecraft 1.21.4 (minecraft)
NeoForge 21.4.156 (neoforge)
[12:17:48.036] [main/INFO] [LaunchServiceHandler/MODLAUNCHER]: Launching target 'neoforgeserver' with arguments [nogui]
[12:17:48] [main/WARN] [minecraft/Eula]: Failed to load eula.txt
[12:17:48] [main/INFO] [minecraft/Main]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.
❯ ls
config libraries mods run.bat server.jar user_jvm_args.txt
defaultconfigs logs eula.txt run.sh server.jar.log
这里的输出信息也非常清楚,提示你需要修改 eula.txt 文件。像之前一样调整好参数之后,就可以启动了。似乎没看到 server.properties 文件?我们先继续走吧。
❯ ./run.sh
[12:22:27.161] [main/INFO] [Launcher/MODLAUNCHER]: ModLauncher running: args [--launchTarget, neoforgeserver, --fml.neoForgeVersion, 21.4.156, --fml.fmlVersion, 6.0.18, --fml.mcVersion, 1.21.4, --fml.neoFormVersion, 20241203.161809, nogui]
[12:22:27.164] [main/INFO] [Launcher/MODLAUNCHER]: JVM identified as Arch Linux OpenJDK 64-Bit Server VM 21.0.10+7
[12:22:27.165] [main/INFO] [Launcher/MODLAUNCHER]: ModLauncher 11.0.4+main.d2e20e43 starting: java version 21.0.10 by Arch Linux; OS Linux arch amd64 version 6.18.4-arch1-1
[12:22:27.285] [main/INFO] [loading.ImmediateWindowHandler/]: ImmediateWindowProvider not loading because launch target is neoforgeserver
[12:22:27.345] [main/INFO] [mixin/]: SpongePowered MIXIN Subsystem Version=0.8.7 Source=union:/home/shwan/mc-server/neoforge/libraries/net/fabricmc/sponge-mixin/0.15.2+mixin.0.8.7/sponge-mixin-0.15.2+mixin.0.8.7.jar%2385!/ Service=ModLauncher Env=SERVER
[12:22:27.652] [main/INFO] [loading.moddiscovery.ModDiscoverer/SCAN]: Found mod file "server-1.21.4-20241203.161809-srg.jar" [locator: production server provider +net.neoforged:neoforge:21.4.156:server]
[12:22:27.677] [main/INFO] [loading.moddiscovery.ModDiscoverer/SCAN]: Found mod file "neoforge-21.4.156-universal.jar" [locator: PathBasedLocator[name=neoforge, paths=[libraries/net/neoforged/neoforge/21.4.156/neoforge-21.4.156-universal.jar]], reader: mod manifest]
[12:22:27.802] [main/INFO] [loading.moddiscovery.locators.JarInJarDependencyLocator/]: Found 2 dependencies adding them to mods collection
[12:22:27.802] [main/INFO] [loading.moddiscovery.ModDiscoverer/SCAN]: Found gamelibrary file "mixinextras-neoforge-0.5.0.jar" [parent: neoforge-21.4.156-universal.jar, locator: jarinjar, reader: mod manifest]
[12:22:27.802] [main/INFO] [loading.moddiscovery.ModDiscoverer/SCAN]: Found library file "net.neoforged.neoforge-coremods-21.4.156.jar" [parent: neoforge-21.4.156-universal.jar, locator: jarinjar, reader: mod manifest]
[12:22:27.804] [main/INFO] [loading.moddiscovery.ModDiscoverer/]:
Mod List:
Name Version (Mod Id)
Minecraft 1.21.4 (minecraft)
NeoForge 21.4.156 (neoforge)
[12:22:28.144] [main/INFO] [LaunchServiceHandler/MODLAUNCHER]: Launching target 'neoforgeserver' with arguments [nogui]
[12:22:29] [main/INFO] [MixinExtras|Service/]: Initializing MixinExtras via com.llamalad7.mixinextras.service.MixinExtrasServiceImpl(version=0.5.0).
[12:22:34] [modloading-worker-0/INFO] [ne.ne.ne.co.NeoForgeMod/NEOFORGE-MOD]: NeoForge mod loading, version 21.4.156, for MC 1.21.4
[12:22:34] [main/ERROR] [minecraft/Settings]: Failed to load properties from file: server.properties
java.nio.file.NoSuchFileException: server.properties
at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:92) ~[?:?] {}
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:106) ~[?:?] {}
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111) ~[?:?] {}
at java.base/sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:261) ~[?:?] {}
at java.base/java.nio.file.Files.newByteChannel(Files.java:380) ~[?:?] {}
at java.base/java.nio.file.Files.newByteChannel(Files.java:432) ~[?:?] {}
at java.base/java.nio.file.spi.FileSystemProvider.newInputStream(FileSystemProvider.java:420) ~[?:?] {}
at java.base/java.nio.file.Files.newInputStream(Files.java:160) ~[?:?] {}
at TRANSFORMER/minecraft@1.21.4/net.minecraft.server.dedicated.Settings.loadFromFile(Settings.java:38) ~[server-1.21.4-20241203.161809-srg.jar%23141!/:?] {re:classloading}
at TRANSFORMER/minecraft@1.21.4/net.minecraft.server.dedicated.DedicatedServerProperties.fromFile(DedicatedServerProperties.java:132) ~[server-1.21.4-20241203.161809-srg.jar%23141!/:?] {re:classloading}
at TRANSFORMER/minecraft@1.21.4/net.minecraft.server.dedicated.DedicatedServerSettings.<init>(DedicatedServerSettings.java:12) ~[server-1.21.4-20241203.161809-srg.jar%23141!/:?] {re:classloading}
at TRANSFORMER/minecraft@1.21.4/net.minecraft.server.Main.main(Main.java:129) ~[server-1.21.4-20241203.161809-srg.jar%23141!/:?] {re:classloading}
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[?:?] {}
at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[?:?] {}
at MC-BOOTSTRAP/fml_loader@6.0.18/net.neoforged.fml.loading.targets.CommonLaunchHandler.runTarget(CommonLaunchHandler.java:128) ~[loader-6.0.18.jar%2371!/:6.0] {}
at MC-BOOTSTRAP/fml_loader@6.0.18/net.neoforged.fml.loading.targets.CommonLaunchHandler.serverService(CommonLaunchHandler.java:124) ~[loader-6.0.18.jar%2371!/:6.0] {}
at MC-BOOTSTRAP/fml_loader@6.0.18/net.neoforged.fml.loading.targets.NeoForgeServerLaunchHandler.runService(NeoForgeServerLaunchHandler.java:39) ~[loader-6.0.18.jar%2371!/:6.0] {}
at MC-BOOTSTRAP/fml_loader@6.0.18/net.neoforged.fml.loading.targets.CommonLaunchHandler.lambda$launchService$4(CommonLaunchHandler.java:114) ~[loader-6.0.18.jar%2371!/:6.0] {}
at MC-BOOTSTRAP/cpw.mods.modlauncher@11.0.4/cpw.mods.modlauncher.LaunchServiceHandlerDecorator.launch(LaunchServiceHandlerDecorator.java:30) [modlauncher-11.0.4.jar%2376!/:?] {}
at MC-BOOTSTRAP/cpw.mods.modlauncher@11.0.4/cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:53) [modlauncher-11.0.4.jar%2376!/:?] {}
at MC-BOOTSTRAP/cpw.mods.modlauncher@11.0.4/cpw.mods.modlauncher.LaunchServiceHandler.launch(LaunchServiceHandler.java:71) [modlauncher-11.0.4.jar%2376!/:?] {}
at MC-BOOTSTRAP/cpw.mods.modlauncher@11.0.4/cpw.mods.modlauncher.Launcher.run(Launcher.java:103) [modlauncher-11.0.4.jar%2376!/:?] {}
at MC-BOOTSTRAP/cpw.mods.modlauncher@11.0.4/cpw.mods.modlauncher.Launcher.main(Launcher.java:74) [modlauncher-11.0.4.jar%2376!/:?] {}
at MC-BOOTSTRAP/cpw.mods.modlauncher@11.0.4/cpw.mods.modlauncher.BootstrapLaunchConsumer.accept(BootstrapLaunchConsumer.java:26) [modlauncher-11.0.4.jar%2376!/:?] {}
at MC-BOOTSTRAP/cpw.mods.modlauncher@11.0.4/cpw.mods.modlauncher.BootstrapLaunchConsumer.accept(BootstrapLaunchConsumer.java:23) [modlauncher-11.0.4.jar%2376!/:?] {}
at cpw.mods.bootstraplauncher@2.0.2/cpw.mods.bootstraplauncher.BootstrapLauncher.run(BootstrapLauncher.java:210) [bootstraplauncher-2.0.2.jar:?] {}
at cpw.mods.bootstraplauncher@2.0.2/cpw.mods.bootstraplauncher.BootstrapLauncher.main(BootstrapLauncher.java:69) [bootstraplauncher-2.0.2.jar:?] {}
[12:22:34] [main/INFO] [mojang/YggdrasilAuthenticationService]: Environment: Environment[sessionHost=https://sessionserver.mojang.com, servicesHost=https://api.minecraftservices.com, name=PROD]
[12:22:34] [main/WARN] [minecraft/VanillaPackResourcesBuilder]: Assets URL 'union:/home/shwan/mc-server/neoforge/libraries/net/minecraft/server/1.21.4-20241203.161809/server-1.21.4-20241203.161809-srg.jar%23141!/assets/.mcassetsroot' uses unexpected schema
[12:22:34] [main/WARN] [minecraft/VanillaPackResourcesBuilder]: Assets URL 'union:/home/shwan/mc-server/neoforge/libraries/net/minecraft/server/1.21.4-20241203.161809/server-1.21.4-20241203.161809-srg.jar%23141!/data/.mcassetsroot' uses unexpected schema
[12:22:35] [main/INFO] [minecraft/Main]: No existing world data, creating new world
[12:22:36] [main/INFO] [minecraft/RecipeManager]: Loaded 1370 recipes
[12:22:36] [main/INFO] [minecraft/AdvancementTree]: Loaded 1481 advancements
[12:22:36] [main/INFO] [ne.ne.ne.co.cr.RecipePriorityManager/]: Loaded 0 recipe priority overrides
[12:22:36] [Server thread/INFO] [minecraft/DedicatedServer]: Starting minecraft server version 1.21.4
[12:22:36] [Server thread/INFO] [minecraft/DedicatedServer]: Loading properties
[12:22:36] [Server thread/INFO] [minecraft/DedicatedServer]: Default game type: SURVIVAL
[12:22:36] [Server thread/INFO] [minecraft/MinecraftServer]: Generating keypair
[12:22:36] [Server thread/INFO] [minecraft/DedicatedServer]: Starting Minecraft server on *:25565
[12:22:36] [Server thread/INFO] [minecraft/ServerConnectionListener]: Using epoll channel type
[12:22:36] [Server thread/INFO] [minecraft/DedicatedServer]: Preparing level "world"
[12:22:40] [Server thread/INFO] [minecraft/MinecraftServer]: Preparing start region for dimension minecraft:overworld
[12:22:40] [Worker-Main-36/INFO] [minecraft/LoggerChunkProgressListener]: Preparing spawn area: 2%
[12:22:40] [Worker-Main-41/INFO] [minecraft/LoggerChunkProgressListener]: Preparing spawn area: 2%
[12:22:41] [Worker-Main-39/INFO] [minecraft/LoggerChunkProgressListener]: Preparing spawn area: 2%
[12:22:41] [Worker-Main-33/INFO] [minecraft/LoggerChunkProgressListener]: Preparing spawn area: 18%
[12:22:42] [Worker-Main-41/INFO] [minecraft/LoggerChunkProgressListener]: Preparing spawn area: 22%
[12:22:42] [Worker-Main-29/INFO] [minecraft/LoggerChunkProgressListener]: Preparing spawn area: 51%
[12:22:43] [Worker-Main-36/INFO] [minecraft/LoggerChunkProgressListener]: Preparing spawn area: 53%
[12:22:43] [Server thread/INFO] [minecraft/LoggerChunkProgressListener]: Time elapsed: 3065 ms
[12:22:43] [Server thread/INFO] [minecraft/DedicatedServer]: Done (6.627s)! For help, type "help"
[12:22:43] [Server thread/INFO] [ne.ne.ne.se.pe.PermissionAPI/]: Successfully initialized permission handler neoforge:default_handler
>
这启动信息就比纯原版清楚多了,“Successfully …” 清楚的告诉你启动成功了,后面的 > 告诉你这里还可以输入命令交互式的调整服务器,原版没有任何提示,不知道的还以为不能交互呢。上面的报错信息里面又提示没有 sever.properties 文件,自动生成一个。这时你可以 stop 然后配置该文件了。
> stop
[12:26:09] [Server thread/INFO] [minecraft/MinecraftServer]: Stopping the server
[12:26:09] [Server thread/INFO] [minecraft/MinecraftServer]: Stopping server
[12:26:09] [Server thread/INFO] [minecraft/MinecraftServer]: Saving players
[12:26:09] [Server thread/INFO] [minecraft/MinecraftServer]: Saving worlds
[12:26:37] [Server thread/INFO] [minecraft/MinecraftServer]: Saving chunks for level 'ServerLevel[world]'/minecraft:overworld
[12:26:37] [Server thread/INFO] [minecraft/MinecraftServer]: Saving chunks for level 'ServerLevel[world]'/minecraft:the_nether
[12:26:37] [Server thread/INFO] [minecraft/MinecraftServer]: Saving chunks for level 'ServerLevel[world]'/minecraft:the_end
[12:26:37] [Server thread/INFO] [minecraft/MinecraftServer]: ThreadedAnvilChunkStorage (world): All chunks are saved
[12:26:37] [Server thread/INFO] [minecraft/MinecraftServer]: ThreadedAnvilChunkStorage (DIM-1): All chunks are saved
[12:26:37] [Server thread/INFO] [minecraft/MinecraftServer]: ThreadedAnvilChunkStorage (DIM1): All chunks are saved
[12:26:37] [Server thread/INFO] [minecraft/MinecraftServer]: ThreadedAnvilChunkStorage: All dimensions are saved
> % ❯ ls
config libraries mods banned-ips.json eula.txt run.bat server.jar server.properties user_jvm_args.txt
defaultconfigs logs world banned-players.json ops.json run.sh server.jar.log usercache.json whitelist.json
❯ nvim server.propertie
此时一个能启动的无模组的模组服已经建立好了。根据 neoforge 官方的文档,添加 mod 的办法也非常直接,看到那个 mod 文件夹了吗,把 mod 文件塞进去就可以了。至于整合包开服,文档中也说明了一下,不是这么简单的,往往需要去看整合包作者提供的文档。如果作者不负责,就只能拿客户端文件来自己制作服务端文件了。