Skip to main content

Plugin Development Workflow

Setting Up a New Plugin Project

# 1. Create project directory
mkdir my-plugin
cd my-plugin

# 2. Download latest Paper server for testing
mcmp tool paper download --interactive

# 3. Add Bukkit API dependency
mcmp add org.bukkit:bukkit --version 1.21.1-R0.1-SNAPSHOT

# 4. Create your plugin structure
mkdir -p src/main/java/com/example/plugin

Development with Watch Mode

# Terminal 1: Auto-compile your plugin
mcmp build --watch --target jar --main-class com.example.plugin.MyPlugin

# Terminal 2: Auto-restart your test server
mcmp run --watch --jvm-args "-Xmx2G"

Complete Plugin Development Setup

# 1. Initialize project
mkdir my-awesome-plugin
cd my-awesome-plugin

# 2. Add dependencies
mcmp add org.bukkit:bukkit --version 1.21.1-R0.1-SNAPSHOT
mcmp add org.spigotmc:spigot-api --version 1.21.1-R0.1-SNAPSHOT
mcmp add junit --version 5.9.2 --scope test

# 3. Add Maven Central repository
mcmp repo central --url https://repo1.maven.org/maven2/

# 4. Download Paper server for testing
mcmp tool paper download --project paper --version 1.21.1 --output ./server/

# 5. Start development
mcmp build --watch --target jar --main-class com.example.MyPlugin

Server Management

Automated Server Updates

#!/bin/bash
# update-server.sh

# Get latest Paper version
LATEST_VERSION=$(mcmp tool paper versions paper --flatten --number 1 | jq -r '.[0]')

# Get latest build for that version
LATEST_BUILD=$(mcmp tool paper latest paper $LATEST_VERSION --output json | jq -r '.build')

# Download to server directory
mcmp tool paper download \
  --project paper \
  --version $LATEST_VERSION \
  --build $LATEST_BUILD \
  --output ./server/

echo "Updated to Paper $LATEST_VERSION build $LATEST_BUILD"

Multi-Server Setup

# Create multiple server instances
for version in 1.20.4 1.21.1; do
  mkdir -p servers/paper-$version
  mcmp tool paper download \
    --project paper \
    --version $version \
    --output servers/paper-$version/
done

CI/CD Integration

GitHub Actions Example

name: Build and Test Plugin

on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      
      - name: Install MCMP CLI
        run: cargo install mcmp_cli
        
      - name: Download Paper Server
        run: mcmp tool paper download --project paper --version 1.21.1 --output ./server/
        
      - name: Build Plugin
        run: mcmp build --target jar --main-class com.example.MyPlugin
        
      - name: Test Plugin
        run: mcmp run --classpath ./target/classes:./server/paper-1.21.1.jar

Docker Integration

FROM openjdk:17-jdk-slim

# Install MCMP CLI
RUN cargo install mcmp_cli

# Set working directory
WORKDIR /app

# Copy project files
COPY . .

# Build the project
RUN mcmp build --target jar --main-class com.example.MyPlugin

# Download Paper server
RUN mcmp tool paper download --project paper --version 1.21.1 --output ./server/

# Expose port
EXPOSE 25565

# Start server
CMD ["mcmp", "run", "--classpath", "./target/classes:./server/paper-1.21.1.jar"]

Advanced Usage

Custom Build Scripts

#!/bin/bash
# build-plugin.sh

PLUGIN_NAME="MyPlugin"
VERSION="1.0.0"
MAIN_CLASS="com.example.MyPlugin"

# Build the plugin
mcmp build \
  --target jar \
  --main-class $MAIN_CLASS \
  --jar-name ${PLUGIN_NAME}-${VERSION}.jar

# Create plugin.yml
cat > plugin.yml << EOF
name: $PLUGIN_NAME
version: $VERSION
main: $MAIN_CLASS
api-version: 1.21
EOF

# Package everything
mkdir -p dist
cp target/${PLUGIN_NAME}-${VERSION}.jar dist/
cp plugin.yml dist/

echo "Plugin built: dist/${PLUGIN_NAME}-${VERSION}.jar"

Dependency Management

# Add multiple dependencies at once
mcmp add org.bukkit:bukkit --version 1.21.1-R0.1-SNAPSHOT
mcmp add org.spigotmc:spigot-api --version 1.21.1-R0.1-SNAPSHOT
mcmp add com.google.guava:guava --version 32.1.2-jre
mcmp add org.slf4j:slf4j-api --version 2.0.7

# Add test dependencies
mcmp add junit --version 5.9.2 --scope test
mcmp add org.mockito:mockito-core --version 5.3.1 --scope test

# View dependency tree
mcmp tree

Server Configuration

# Download and configure server
mcmp tool paper download --project paper --version 1.21.1 --output ./server/

# Create server.properties
cat > server/server.properties << EOF
server-port=25565
max-players=20
motd=My Awesome Server
gamemode=survival
difficulty=normal
level-name=world
EOF

# Create eula.txt
echo "eula=true" > server/eula.txt

# Start server
cd server
mcmp run --jvm-args "-Xmx2G -Xms1G"

Troubleshooting

Common Issues

Build fails with classpath errors:
# Check dependencies
mcmp tree

# Add missing dependency
mcmp add org.bukkit:bukkit --version 1.21.1-R0.1-SNAPSHOT
Server won’t start:
# Check Java version
java -version

# Run with debug output
mcmp run --jvm-args "-Xmx2G -Ddebug=true"
Download fails:
# Use interactive mode for better error messages
mcmp tool paper download --interactive

# Check available versions
mcmp tool paper versions paper

Performance Tips

For large projects:
# Use incremental compilation
mcmp build --watch

# Optimize JVM settings
mcmp run --jvm-args "-Xmx4G -Xms2G -XX:+UseG1GC"
For development:
# Use watch mode for rapid iteration
mcmp build --watch &
mcmp run --watch

Integration with Other Tools

VS Code Integration

Create .vscode/tasks.json:
{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "Build Plugin",
      "type": "shell",
      "command": "mcmp",
      "args": ["build", "--target", "jar", "--main-class", "com.example.MyPlugin"],
      "group": "build"
    },
    {
      "label": "Run Server",
      "type": "shell",
      "command": "mcmp",
      "args": ["run", "--jvm-args", "-Xmx2G"],
      "group": "test"
    }
  ]
}

Makefile Integration

.PHONY: build run clean test

build:
	mcmp build --target jar --main-class com.example.MyPlugin

run:
	mcmp run --jvm-args "-Xmx2G"

clean:
	rm -rf target/

test:
	mcmp run --classpath ./target/classes:./server/paper-1.21.1.jar

download-server:
	mcmp tool paper download --project paper --version 1.21.1 --output ./server/