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

PaperMC 插件开发完全指南 / 第 2 章:开发环境搭建

第 2 章:开发环境搭建

从零开始配置开发环境,掌握 Maven / Gradle 项目结构与初始化流程。


2.1 前置软件安装

必装软件清单

软件最低版本推荐版本用途
JDK1721(LTS)编译和运行
IDE任意IntelliJ IDEA Community代码编写
Maven3.83.9+构建工具(Maven 方案)
Gradle8.08.10+构建工具(Gradle 方案)
Git2.0最新版本控制

JDK 安装(推荐 SDKMAN)

# 安装 SDKMAN
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"

# 安装 JDK 21
sdk install java 21.0.3-tem

# 验证
java -version
# openjdk version "21.0.3" ...

IntelliJ IDEA 配置建议

  1. 安装 Minecraft Development 插件(可选,但有语法高亮和模板)
  2. 设置 JDK: File → Project Structure → SDKs → 添加 JDK 21
  3. 启用注解处理: Build → Compiler → Annotation Processors → Enable

2.2 Maven 项目初始化

推荐目录结构

my-plugin/
├── pom.xml
├── src/
│   └── main/
│       ├── java/
│       │   └── com/example/myplugin/
│       │       ├── MyPlugin.java          # 主类
│       │       ├── commands/               # 命令处理
│       │       ├── listeners/              # 事件监听
│       │       ├── managers/               # 管理器
│       │       └── utils/                  # 工具类
│       └── resources/
│           ├── plugin.yml                  # 插件描述
│           └── config.yml                  # 默认配置
└── README.md

pom.xml 完整配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                             http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <!-- 项目坐标 -->
    <groupId>com.example</groupId>
    <artifactId>my-plugin</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>

    <name>MyPlugin</name>
    <description>一个示例 Paper 插件</description>

    <!-- 编译属性 -->
    <properties>
        <java.version>17</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>${java.version}</maven.compiler.source>
        <maven.compiler.target>${java.version}</maven.compiler.target>
    </properties>

    <repositories>
        <!-- Paper 官方仓库 -->
        <repository>
            <id>papermc</id>
            <url>https://repo.papermc.io/repository/maven-public/</url>
        </repository>
    </repositories>

    <dependencies>
        <!-- Paper API -->
        <dependency>
            <groupId>io.papermc.paper</groupId>
            <artifactId>paper-api</artifactId>
            <version>1.21.4-R0.1-SNAPSHOT</version>
            <scope>provided</scope>
        </dependency>

        <!-- Lombok(可选,减少样板代码) -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.34</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!-- 编译器插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.13.0</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>

            <!-- Shade 插件(打包依赖用,如果不需要可以不加) -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.6.0</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>

        <!-- 确保 resources 目录下的文件被包含 -->
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>
</project>

注意: <filtering>true</filtering> 会让 Maven 在打包时替换 plugin.yml 中的 ${project.version} 等变量。

Maven 常用命令

# 编译
mvn compile

# 打包(生成 JAR)
mvn package

# 清理并重新打包
mvn clean package

# 跳过测试打包
mvn clean package -DskipTests

# 安装到本地仓库
mvn install

2.3 Gradle 项目初始化

build.gradle.kts(Kotlin DSL 推荐)

plugins {
    java
}

group = "com.example"
version = "1.0.0"

java {
    toolchain {
        languageVersion.set(JavaLanguageVersion.of(17))
    }
}

repositories {
    mavenCentral()
    maven("https://repo.papermc.io/repository/maven-public/")
}

dependencies {
    compileOnly("io.papermc.paper:paper-api:1.21.4-R0.1-SNAPSHOT")
    compileOnly("org.projectlombok:lombok:1.18.34")
    annotationProcessor("org.projectlombok:lombok:1.18.34")
}

tasks {
    // 设置编码
    withType<JavaCompile> {
        options.encoding = "UTF-8"
    }

    // 构建 JAR
    jar {
        from(sourceSets.main.get().resources)
        duplicatesStrategy = DuplicatesStrategy.EXCLUDE
    }
}

Gradle 常用命令

# 编译
./gradlew build

# 清理
./gradlew clean

# 编译并跳过测试
./gradlew build -x test

# 查看依赖树
./gradlew dependencies

Maven vs Gradle 对比

维度MavenGradle
配置语言XMLKotlin DSL / Groovy DSL
构建速度较慢(全量)快(增量 + 缓存)
灵活性中等极高
社区生态成熟,插件丰富增长快,Android 标准
学习曲线中等
PaperMC 示例中等

推荐: 如果是新项目,建议用 Gradle (Kotlin DSL);如果已有 Maven 项目或更熟悉 XML 配置,用 Maven


2.4 项目主类编写

标准主类模板

package com.example.myplugin;

import org.bukkit.plugin.java.JavaPlugin;

import java.util.logging.Level;

public final class MyPlugin extends JavaPlugin {

    // 静态实例,方便其他类获取
    private static MyPlugin instance;

    public static MyPlugin getInstance() {
        return instance;
    }

    @Override
    public void onLoad() {
        // 此阶段插件刚加载,不要注册事件或命令
        instance = this;
        getLogger().log(Level.INFO, "MyPlugin 正在加载...");
    }

    @Override
    public void onEnable() {
        // 保存默认配置
        saveDefaultConfig();

        // 注册事件监听器
        registerListeners();

        // 注册命令
        registerCommands();

        getLogger().log(Level.INFO, "MyPlugin 已启用!");
    }

    @Override
    public void onDisable() {
        // 保存所有数据
        saveData();

        getLogger().log(Level.INFO, "MyPlugin 已禁用!");
    }

    private void registerListeners() {
        var pm = getServer().getPluginManager();
        pm.registerEvents(new PlayerListener(this), this);
        pm.registerEvents(new BlockListener(this), this);
    }

    private void registerCommands() {
        var mainCmd = getCommand("myplugin");
        if (mainCmd != null) {
            mainCmd.setExecutor(new MainCommand(this));
            mainCmd.setTabCompleter(new MainCommand(this));
        }
    }

    private void saveData() {
        // 持久化数据逻辑
    }
}

2.5 快速创建项目的方式

方式一:使用模板仓库

PaperMC 官方提供了项目模板:

# 使用 Git 克隆官方示例
git clone https://github.com/PaperMC/paper-plugin-example.git my-plugin
cd my-plugin

# 修改项目名
# 编辑 pom.xml 中的 groupId、artifactId、version

方式二:Maven Archetype

mvn archetype:generate \
    -DgroupId=com.example \
    -DartifactId=my-plugin \
    -DarchetypeGroupId=org.apache.maven.archetypes \
    -DarchetypeArtifactId=maven-archetype-quickstart \
    -DarchetypeVersion=1.4

cd my-plugin
# 然后手动添加 Paper 依赖和 plugin.yml

方式三:IntelliJ IDEA 手动创建

  1. File → New → Project → Maven
  2. 设置 GroupId / ArtifactId / Version
  3. 填写 pom.xml(参考上文)
  4. 创建目录结构
  5. 编写 MyPlugin.javaplugin.yml

2.6 开发服务器搭建

在开发过程中,需要一个本地测试服务器。

下载 Paper 核心

# 创建测试服务器目录
mkdir -p ~/dev-server && cd ~/dev-server

# 下载 Paper(使用 PaperMC API)
# 访问 https://papermc.io/downloads 获取最新链接
curl -o paper.jar https://api.papermc.io/v2/projects/paper/versions/1.21.4/builds/123/downloads/paper-1.21.4-123.jar

# 同意 EULA
echo "eula=true" > eula.txt

# 首次运行(生成配置文件)
java -jar paper.jar --nogui

# 停止后,编辑 server.properties
# 启用离线模式(开发用)
# online-mode=false

启动脚本(start.sh)

#!/bin/bash
java -Xms512M -Xmx2G \
     -XX:+UseG1GC \
     -XX:+ParallelRefProcEnabled \
     -jar paper.jar --nogui

配置 IntelliJ 自动部署

在 IntelliJ 中,可以配置构建后自动复制 JAR 到服务器的 plugins/ 目录:

  1. Run → Edit Configurations
  2. 添加 Shell Script 类型的运行配置
  3. 命令设置为:
# Maven 构建并复制到服务器
mvn clean package -f /path/to/my-plugin/pom.xml && \
cp /path/to/my-plugin/target/my-plugin-1.0.0.jar ~/dev-server/plugins/

2.7 配置文件处理

默认配置文件

src/main/resources/ 下创建 config.yml

# MyPlugin 配置文件
settings:
  debug: false
  language: zh-CN

messages:
  prefix: "&7[&bMyPlugin&7] "
  no-permission: "&c你没有权限执行此操作!"
  player-only: "&c此命令只能由玩家执行!"

读取配置

// onEnable() 中保存默认配置(如果不存在)
saveDefaultConfig();

// 读取配置
FileConfiguration config = getConfig();
boolean debug = config.getBoolean("settings.debug");
String prefix = config.getString("messages.prefix", "&7[&bMyPlugin&7] ");
String lang = config.getString("settings.language", "zh-CN");

保存配置

// 修改配置
FileConfiguration config = getConfig();
config.set("settings.debug", true);

// 保存到文件
saveConfig();

2.8 常见问题排查

问题原因解决方案
ClassNotFoundExceptionPaper API 未标记 provided确认 <scope>provided</scope>
UnsupportedClassVersionErrorJDK 版本不匹配编译和服务端用同版本 JDK
插件加载报错 plugin.yml not found文件未在 resources 根目录确认路径为 src/main/resources/plugin.yml
中文乱码编码不一致设置 project.build.sourceEncoding=UTF-8
NoClassDefFoundErrorShade 打包的依赖冲突重定位(Relocate)冲突的包

2.9 扩展阅读


2.10 本章小结

要点内容
JDK 版本Paper 1.20.5+ 要求 JDK 17+,推荐 JDK 21
构建工具Maven 或 Gradle 均可,新手推荐 Maven
依赖范围Paper API 必须设为 provided
项目模板优先使用 PaperMC 官方示例仓库
测试服务器本地搭建 Paper 服务器,配置自动部署提高效率

下一章: 第 3 章:插件描述文件 — 深入理解 plugin.yml 的结构、权限声明和命令注册。