Anleitung
So erstellst du ein Minecraft-Plugin in Kotlin
Aktualisiert am 18. Oktober 2026
Kotlin läuft auf der JVM, daher nutzt ein Kotlin-Plugin dieselbe Paper- oder Spigot-API, dieselbe plugin.yml und denselben Ordner plugins/ wie ein Java-Plugin. Der Code ist kürzer und null-sicher. Das Einzige, worum sich Java-Plugins nicht kümmern müssen, ist die Kotlin-Standardbibliothek: Der Server liefert sie nicht mit, also muss das Plugin sie mitbringen.
Starte mit diesem Beispiel.
Mit Codexe erstellenSchritt für Schritt
1.Erstelle ein Gradle-Projekt mit Kotlin DSL
Eine
build.gradle.ktsmit dem Pluginkotlin("jvm"), einer Java-Toolchain passend zu deiner Minecraft-Version (17, 21 oder 25) und dem PaperMC-Repository.2.Füge die Server-API hinzu
compileOnly("io.papermc.paper:paper-api:<version>"). Wie bei Java stellt der Server sie zur Laufzeit bereit, sie wird also nie mitgepackt.3.Die Hauptklasse schreiben
class MyPlugin : JavaPlugin()mitoverride fun onEnable(). Registriere Befehle und Listener genau wie in Java.4.Bring die Kotlin-Standardbibliothek mit
Pack sie mit dem Shadow-Plugin in die .jar oder lass den Server sie beim Start über die Liste
librariesin derplugin.ymlherunterladen. Ohne eines von beiden scheitert das Plugin mitNoClassDefFoundError: kotlin/....5.plugin.yml schreiben
Dieselbe Datei wie bei einem Java-Plugin: Name, Version, main (die Kotlin-Klasse),
api-version, Befehle und Berechtigungen.6.Bauen und testen
./gradlew shadowJar(oderbuild), kopiere die .jar ausbuild/libs/auf einen Testserver und lies beim Start die Konsole.
Kotlin auf den Server bringen
- Shaden: Das Gradle-Plugin Shadow kopiert die Kotlin-Standardbibliothek und andere Laufzeitbibliotheken in deine .jar. Das funktioniert in jeder Version und ist die häufigste Wahl.
- libraries in der plugin.yml: Ab Spigot 1.16.5 kann ein Plugin Bibliotheken aus Maven Central auflisten, die der Server für es herunterlädt und lädt. Die .jar bleibt klein, aber der Server braucht beim ersten Start Internetzugang.
- Bibliotheken, die du hinzufügst: kotlinx-coroutines ist eine eigene Bibliothek, nicht Teil der Standardbibliothek, und muss ebenfalls mitgepackt werden. Wenn du sie in dein eigenes Paket verschiebst (Relocation), vermeidest du Konflikte mit anderen Plugins, die eine andere Version mitbringen.
Coroutines und der Hauptthread
Coroutines sind ein sauberer Weg, Daten aus einer Datenbank zu laden, ohne den Server einzufrieren, aber die Bukkit-API (Welten, Entities, Inventare) muss trotzdem vom Hauptthread aus genutzt werden. Erledige die langsame Arbeit auf einem Hintergrund-Dispatcher und wechsle dann mit dem Scheduler zurück auf den Server-Thread, bevor du das Spiel anfasst. Binde den Coroutine-Scope an das Plugin, damit er in onDisable() abgebrochen wird.
Java oder Kotlin?
| Feature | Java | Kotlin |
|---|---|---|
| API | Paper / Spigot | Dieselbe Paper- / Spigot-API |
| Build | Maven oder Gradle | Gradle mit build.gradle.kts |
| Zusätzlich zur Laufzeit | Keine | Kotlin-Standardbibliothek, mitgepackt oder geladen |
| Tutorials und Beispiele | Die meisten | Weniger, aber Java-Beispiele lassen sich direkt übertragen |
Mit Codexe
Wähle Bukkit/Spigot/Paper (Kotlin). Codexe generiert ein Gradle-Projekt mit build.gradle.kts, der Paper-API, dem Shadow-Plugin, das mitpackt, was der Server nicht bereitstellt, und Coroutines, die mitgepackt und verschoben werden, wenn der Code sie nutzt. Das Plugin wird kompiliert, bevor es als Ready gilt, und Kotlin-Plugins lassen sich wie Java-Plugins auf einem Testserver ausprobieren und von Testspielern prüfen. Siehe den Kotlin-Plugin-Generator.
„Ein Plugin für Paper 1.21.4 in Kotlin namens Bounties: /bounty set <player> <amount> über Vault, der Mörder bekommt die Belohnung, /bounty top zeigt die 10 höchsten, gespeichert in SQLite mit Coroutines für den Datenbankzugriff. Nutze Data Classes und Extension Functions, halte die Aufrufe der Bukkit-API auf dem Hauptthread.“
Fragen
Ist ein Kotlin-Plugin langsamer als ein Java-Plugin?
Kein nennenswerter Unterschied: Beide werden zu JVM-Bytecode kompiliert. Die .jar ist größer, wenn die Standardbibliothek mitgepackt wird.
Kann ich Java und Kotlin in einem Plugin mischen?
Ja, Gradle kompiliert beides im selben Projekt, und Kotlin-Code ruft Java-Klassen direkt auf.
Warum NoClassDefFoundError bei Kotlin-Klassen?
Die Kotlin-Standardbibliothek ist nicht in der .jar oder wird nicht geladen. Baue mit shadowJar und installiere diese .jar, oder füge die Bibliothek unter libraries in der plugin.yml hinzu.
Erstelle ein Kotlin-Plugin
Dieser Prompt öffnet sich versandfertig:
“Ein Plugin für Paper 1.21.4 in Kotlin namens Bounties: /bounty set <player> <amount> über die Vault-Economy, der Mörder bekommt die Belohnung, /bounty top zeigt die 10 höchsten, Kopfgelder in SQLite gespeichert mit Coroutines für den Datenbankzugriff, Aufrufe der Bukkit-API auf dem Hauptthread, Nachrichten in der config.yml.”
Mit Codexe erstellen