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

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

06 - 插件管理

6.1 插件基础

6.1.1 插件是什么

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

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

6.1.2 插件兼容性矩阵

插件类型 CraftBukkit Spigot Paper Purpur
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 主要下载来源

来源 地址 特点
SpigotMC spigotmc.org 最大的插件市场
Hangar hangar.papermc.io PaperMC 官方插件平台
Modrinth modrinth.com 现代化平台,API 友好
GitHub github.com 开源插件首选
BukkitDev dev.bukkit.org 老牌平台,部分过时

6.3 必备插件推荐

6.3.1 基础类

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

6.3.2 管理类

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

6.3.3 反作弊类

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

6.3.4 经济与玩法类

插件 说明 重要程度
CMI 全功能管理 ⭐⭐⭐
mcMMO RPG 技能系统 ⭐⭐⭐
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 签名和网络行为

扩展阅读