强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

Minecraft PaperMC 服务器部署指南 / 06 - 插件管理

06 - 插件管理

6.1 插件基础

6.1.1 插件是什么

插件(Plugin)是运行在服务端的扩展模块,不修改游戏客户端,玩家无需安装任何额外软件即可体验插件功能。

客户端 (Minecraft)  ←→  服务端 (PaperMC + 插件)
     原版客户端            PaperMC
                           ├── EssentialsX
                           ├── WorldEdit
                           ├── LuckPerms
                           └── ...

6.1.2 插件兼容性矩阵

插件类型CraftBukkitSpigotPaperPurpur
Bukkit 插件
Spigot 插件
Paper 插件
Purpur 插件

结论:Paper 兼容所有 Bukkit 和 Spigot 插件,向下兼容性非常好。

6.1.3 API 版本说明

# 插件的 plugin.yml 或 paper-plugin.yml 中
api-version: "1.20"   # 表示支持 1.20+ 的 API

PaperMC 使用 api-version 来兼容不同版本的插件。通常设为最新支持的大版本号。


6.2 插件安装流程

6.2.1 基本步骤

# 1. 下载插件 JAR 文件
# 2. 放入 plugins/ 目录
# 3. 重启服务器(推荐)或使用 /reload(不推荐)
# 4. 插件自动生成配置文件到 plugins/<插件名>/
# 5. 编辑配置文件
# 6. 重启服务器使配置生效

6.2.2 下载插件的安全原则

原则说明
从官方渠道下载GitHub Releases、SpigotMC、Hangar、Modrinth
检查版本兼容性确认支持你的 PaperMC 版本
阅读更新日志了解已知问题和 breaking changes
避免盗版插件防止后门和恶意代码
备份再更新更新前备份 plugins/ 目录和配置

6.2.3 主要下载来源

来源地址特点
SpigotMCspigotmc.org最大的插件市场
Hangarhangar.papermc.ioPaperMC 官方插件平台
Modrinthmodrinth.com现代化平台,API 友好
GitHubgithub.com开源插件首选
BukkitDevdev.bukkit.org老牌平台,部分过时

6.3 必备插件推荐

6.3.1 基础类

插件说明重要程度
LuckPerms权限管理⭐⭐⭐⭐⭐
EssentialsX基础命令集⭐⭐⭐⭐⭐
Vault经济/权限 API 桥接⭐⭐⭐⭐⭐
PlaceholderAPI变量占位符 API⭐⭐⭐⭐
CoreProtect方块日志/回滚⭐⭐⭐⭐⭐

6.3.2 管理类

插件说明重要程度
WorldEdit世界编辑⭐⭐⭐⭐
WorldGuard区域保护⭐⭐⭐⭐
AuthMe登录/注册⭐⭐⭐⭐(盗版服必需)
TABTab 列表美化⭐⭐⭐
Spark性能分析⭐⭐⭐⭐

6.3.3 反作弊类

插件说明重要程度
Vulcan高级反作弊⭐⭐⭐⭐
NoCheatPlus老牌反作弊⭐⭐⭐
AntiXrayPaper 内置⭐⭐⭐⭐

6.3.4 经济与玩法类

插件说明重要程度
CMI全功能管理⭐⭐⭐
mcMMORPG 技能系统⭐⭐⭐
Dynmap网页地图⭐⭐⭐
GSit坐下/躺下⭐⭐
HeadDB头颅装饰库⭐⭐

6.3.5 免费 vs 付费插件

类型优势劣势示例
免费开源透明、安全、社区维护功能可能不如商业版WorldEdit、LuckPerms
免费闭源功能完整可能有后门风险部分 Spigot 免费插件
付费插件功能强大、有支持需付费、可能停更Vulcan、CMI

警告:从非官方渠道下载的免费插件可能包含后门。建议仅使用上述可信来源。


6.4 插件配置管理

6.4.1 配置文件结构

plugins/
├── LuckPerms/
│   └── config.yml
├── Essentials/
│   ├── config.yml
│   ├── userdata/         # 玩家数据
│   ├── warps/            # 传送点
│   └── jails/            # 监狱
├── WorldEdit/
│   └── config.yml
├── WorldGuard/
│   ├── config.yml
│   └── worlds/
│       └── world/
│           └── regions.yml
└── CoreProtect/
    └── config.yml

6.4.2 热重载配置

# 大部分插件支持重载命令
/ess reload             # EssentialsX
/lp reloadconfig        # LuckPerms
/we reload              # WorldEdit (部分配置)
/wg reload              # WorldGuard
/coreprotect reload     # CoreProtect

# 查看插件是否有重载命令
/plugins                 # 列出已加载插件
/help <插件名>          # 查看插件帮助

注意:不是所有配置都支持热重载。涉及数据库连接、权限缓存等通常需要重启。

6.4.3 配置版本管理(Git)

# 初始化 Git 仓库(用于跟踪配置变更)
cd /opt/minecraft/paper/plugins
git init
echo "*.jar" >> .gitignore
echo "*.class" >> .gitignore
echo "update/" >> .gitignore

# 提交初始配置
git add .
git commit -m "chore: init plugin configs"

# 修改配置后提交
git add .
git commit -m "feat: update WorldGuard region config"

# 查看变更历史
git log --oneline

# 回滚到之前的配置
git revert HEAD

6.5 插件更新

6.5.1 手动更新流程

# 1. 备份当前插件
mkdir -p /opt/minecraft/backups/plugins_$(date +%Y%m%d)
cp -r /opt/minecraft/paper/plugins/*.jar /opt/minecraft/backups/plugins_$(date +%Y%m%d)/
cp -r /opt/minecraft/paper/plugins/ /opt/minecraft/backups/plugins_config_$(date +%Y%m%d)/

# 2. 下载新版本插件 JAR
wget -O /opt/minecraft/paper/plugins/NewPlugin.jar "<新版本URL>"

# 3. 删除旧版本 JAR
rm /opt/minecraft/paper/plugins/OldPlugin.jar

# 4. 重启服务器

6.5.2 使用 PlugMan 管理(不推荐用于生产)

# 安装 PlugManX(仅用于开发/测试环境)
# https://github.com/Sander0542/PlugManX

# 列出插件
/plugman list

# 加载/卸载/重载插件(危险!可能导致问题)
/plugman load <插件名>
/plugman unload <插件名>
/plugman reload <插件名>

警告:使用 PlugMan 热加载/卸载插件可能导致内存泄漏、数据不一致等问题。生产环境应始终重启服务器

6.5.3 Paper 自动更新文件夹

# bukkit.yml
settings:
  update-folder: update
# 将新版本 JAR 放入 plugins/update/ 目录
# 服务器下次重启时会自动替换
cp NewPlugin.jar /opt/minecraft/paper/plugins/update/
# 然后重启服务器

6.6 插件冲突排查

6.6.1 二分法排查(最常用)

# 假设服务器出现异常,怀疑是某个插件导致

# 1. 将 plugins/ 中一半的插件移到 disabled/ 目录
mkdir -p /opt/minecraft/paper/plugins-disabled
mv /opt/minecraft/paper/plugins/A*.jar /opt/minecraft/paper/plugins-disabled/
mv /opt/minecraft/paper/plugins/B*.jar /opt/minecraft/paper/plugins-disabled/
mv /opt/minecraft/paper/plugins/C*.jar /opt/minecraft/paper/plugins-disabled/
# ... 移动一半插件

# 2. 重启服务器,检查问题是否仍然存在

# 3. 如果问题消失 → 冲突在移走的那半插件中
#    如果问题仍在 → 冲突在剩余的那半插件中

# 4. 继续二分,直到定位到具体插件

6.6.2 日志分析排查

# 检查启动日志中的错误
grep -i "error\|exception\|failed" /opt/minecraft/paper/logs/latest.log

# 检查插件依赖关系
grep -i "depend\|softdepend" /opt/minecraft/paper/logs/latest.log

# 查看插件加载顺序
grep "Loading" /opt/minecraft/paper/logs/latest.log | grep -i plugin

6.6.3 常见冲突类型

冲突类型表现解决方案
命令冲突两个插件注册了相同命令修改 plugin.yml 中的命令名
事件优先级多个插件监听同一事件调整事件优先级
API 版本不兼容插件使用过时的 API更新插件或找替代品
数据库冲突多个插件操作同一表使用独立数据库前缀
权限节点冲突权限节点互相覆盖检查 LuckPerms 优先级

6.6.4 插件兼容性检查

# 查看插件列表和版本
/plugins

# 输出示例:
# Plugins (25): WorldEdit, WorldGuard, LuckPerms, ...

# 使用 Spark 检查插件性能影响
/spark healthplugins

# 查看插件的性能开销
/spark profiler --timeout 60

6.7 插件开发基础

6.7.1 插件的基本结构

MyPlugin/
├── src/
│   └── main/
│       ├── java/
│       │   └── com/example/myplugin/
│       │       └── MyPlugin.java
│       └── resources/
│           ├── plugin.yml          # Bukkit 插件描述
│           └── paper-plugin.yml    # Paper 插件描述(新方式)
├── pom.xml                         # Maven 构建文件
└── build.gradle.kts                # 或 Gradle 构建文件
# plugin.yml
name: MyPlugin
version: 1.0.0
main: com.example.myplugin.MyPlugin
api-version: "1.20"
description: 我的第一个插件
author: YourName
commands:
  hello:
    description: 打招呼命令
    usage: /hello [玩家名]
permissions:
  myplugin.hello:
    description: 允许使用 /hello 命令
    default: true

6.7.2 Paper Plugin YML(推荐)

# paper-plugin.yml(Paper 1.20.5+ 推荐方式)
name: MyPlugin
version: "1.0.0"
main: com.example.myplugin.MyPlugin
api-version: "1.20"
description: 我的第一个 Paper 插件
authors:
  - YourName

dependencies:
  - name: LuckPerms
    required: false    # 软依赖

permissions:
  myplugin.hello:
    description: 允许使用 /hello 命令
    default: true

6.8 插件安全审计

6.8.1 检查插件安全性

# 1. 检查插件 JAR 的数字签名
jarsigner -verify plugins/SuspiciousPlugin.jar

# 2. 反编译检查(高级)
# 使用 JD-GUI 或 CFR 反编译 JAR
java -jar cfr.jar plugins/SuspiciousPlugin.jar --outputdir /tmp/decompiled/

# 3. 搜索可疑代码模式
grep -r "Runtime.getRuntime" /tmp/decompiled/
grep -r "ProcessBuilder" /tmp/decompiled/
grep -r "http://" /tmp/decompiled/
grep -r "base64" /tmp/decompiled/

6.8.2 插件权限检查

# 检查插件申请的系统权限
unzip -p plugins/MyPlugin.jar META-INF/MANIFEST.MF

# 检查插件的网络行为
# 使用 Spark 监控
/spark profiler

6.9 插件管理脚本

6.9.1 插件备份脚本

#!/bin/bash
# backup-plugins.sh

BACKUP_DIR="/opt/minecraft/backups/plugins"
PLUGIN_DIR="/opt/minecraft/paper/plugins"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)

mkdir -p "$BACKUP_DIR"

# 备份整个 plugins 目录
tar -czf "${BACKUP_DIR}/plugins_${TIMESTAMP}.tar.gz" \
  -C /opt/minecraft/paper plugins/

# 保留最近 10 个备份
ls -t ${BACKUP_DIR}/plugins_*.tar.gz | tail -n +11 | xargs -r rm

echo "插件备份完成: plugins_${TIMESTAMP}.tar.gz"

6.9.2 插件版本清单

#!/bin/bash
# plugin-list.sh - 列出所有插件及其版本

PLUGIN_DIR="/opt/minecraft/paper/plugins"

echo "=== 插件版本清单 ==="
echo "生成时间: $(date)"
echo ""

for jar in ${PLUGIN_DIR}/*.jar; do
    if [ -f "$jar" ]; then
        NAME=$(unzip -p "$jar" plugin.yml 2>/dev/null | grep "^name:" | cut -d: -f2 | tr -d ' ')
        VERSION=$(unzip -p "$jar" plugin.yml 2>/dev/null | grep "^version:" | cut -d: -f2 | tr -d ' ')
        FILENAME=$(basename "$jar")
        echo "${NAME:-$FILENAME} | ${VERSION:-未知} | $FILENAME"
    fi
done | column -t -s "|"

6.10 常见问题

Q1:插件加载失败,提示版本不兼容?

[Server thread/ERROR]: Could not load 'plugins/OldPlugin.jar' in folder 'plugins'
org.bukkit.plugin.InvalidPluginException: Unsupported API version 1.16

解决:更新插件到支持当前 PaperMC 版本的版本,或寻找替代品。

Q2:插件之间命令冲突?

两个插件注册了同一个命令(如 /tp)。解决方法:

  1. 在后加载插件的 config 中禁用冲突命令
  2. 使用 LuckPerms 控制命令权限
  3. 修改插件的 plugin.yml 中的命令名

Q3:插件导致服务器卡顿?

# 使用 Spark 定位性能瓶颈
/spark profiler --timeout 300

# 查看最耗时的插件
/spark healthplugins

6.11 本章小结

要点说明
从可信来源下载插件Hangar、SpigotMC、GitHub
核心插件优先安装LuckPerms、EssentialsX、CoreProtect
更新前必须备份备份 JAR 和配置文件
生产环境不使用 /reload始终重启服务器
二分法排查冲突最有效的插件冲突定位方法
定期审计插件安全检查 JAR 签名和网络行为

扩展阅读