Οδηγός

Πώς να φτιάξεις ένα Minecraft plugin σε Kotlin

Ενημερώθηκε 18 Οκτωβρίου 2026

Η Kotlin τρέχει στο JVM, οπότε ένα plugin σε Kotlin χρησιμοποιεί το ίδιο Paper ή Spigot API, το ίδιο plugin.yml και τον ίδιο φάκελο plugins/ με ένα plugin σε Java. Ο κώδικας είναι πιο σύντομος και null-safe. Το μόνο που δεν απασχολεί τα plugins σε Java είναι η standard library της Kotlin: ο server δεν την περιέχει, οπότε πρέπει να τη φέρει το plugin.

Ξεκίνα από αυτό το παράδειγμα.

Φτιάξ' το με το Codexe

Βήμα βήμα

  1. 1.Δημιούργησε ένα project Gradle με Kotlin DSL

    Ένα build.gradle.kts με το plugin kotlin("jvm"), ένα Java toolchain που ταιριάζει με την έκδοση του Minecraft σου (17, 21 ή 25) και το repository του PaperMC.

  2. 2.Πρόσθεσε το API του server

    compileOnly("io.papermc.paper:paper-api:<version>"). Όπως και στη Java, ο server το παρέχει κατά την εκτέλεση, οπότε δεν μπαίνει ποτέ μέσα στο .jar.

  3. 3.Γράψε την κύρια κλάση

    class MyPlugin : JavaPlugin() με override fun onEnable(). Κατάχωρισε εντολές και listeners ακριβώς όπως στη Java.

  4. 4.Φέρε τη standard library της Kotlin

    Βάλ' τη μέσα στο .jar με το plugin Shadow ή άφησε τον server να την κατεβάσει στην εκκίνηση μέσω της λίστας libraries στο plugin.yml. Χωρίς ένα από τα δύο το plugin αποτυγχάνει με NoClassDefFoundError: kotlin/....

  5. 5.Γράψε το plugin.yml

    Το ίδιο αρχείο με ένα plugin σε Java: όνομα, έκδοση, main (η κλάση Kotlin), api-version, εντολές και permissions.

  6. 6.Build και δοκιμή

    ./gradlew shadowJar (ή build), αντίγραψε το .jar από το build/libs/ σε έναν δοκιμαστικό server και διάβασε την κονσόλα στην εκκίνηση.

Πώς φτάνει η Kotlin στον server

  • Κάνε τη shade: το Gradle plugin Shadow αντιγράφει τη standard library της Kotlin και άλλες βιβλιοθήκες εκτέλεσης μέσα στο .jar σου. Λειτουργεί σε κάθε έκδοση και είναι η πιο συνηθισμένη επιλογή.
  • libraries στο plugin.yml: από το Spigot 1.16.5, ένα plugin μπορεί να δηλώνει βιβλιοθήκες του Maven Central που ο server κατεβάζει και φορτώνει γι' αυτό. Το .jar μένει μικρό, αλλά ο server χρειάζεται πρόσβαση στο internet στην πρώτη εκκίνηση.
  • Βιβλιοθήκες που προσθέτεις: το kotlinx-coroutines είναι ξεχωριστή βιβλιοθήκη, όχι μέρος της standard library, και πρέπει κι αυτό να μπει στο .jar. Αν το κάνεις relocate στο δικό σου package, αποφεύγεις συγκρούσεις με άλλα plugins που περιέχουν άλλη έκδοση.

Coroutines και main thread

Οι coroutines είναι ένας καθαρός τρόπος να φορτώνεις δεδομένα από μια βάση χωρίς να παγώνει ο server, αλλά το Bukkit API (κόσμοι, οντότητες, inventories) πρέπει να χρησιμοποιείται πάντα από το main thread. Κάνε την αργή δουλειά σε έναν background dispatcher και μετά γύρνα στο thread του server με τον scheduler πριν αγγίξεις το παιχνίδι. Δέσε το coroutine scope με το plugin, ώστε να ακυρώνεται στο onDisable().

Java ή Kotlin;

ΛειτουργίαJavaKotlin
APIPaper / SpigotΤο ίδιο Paper / Spigot API
BuildMaven ή GradleGradle με build.gradle.kts
Επιπλέον στην εκτέλεσηΚανέναStandard library της Kotlin, μέσα στο .jar ή φορτωμένη
Tutorials και παραδείγματαΤα περισσότεραΛιγότερα, αλλά τα παραδείγματα σε Java μεταφέρονται κατευθείαν

Με το Codexe

Διάλεξε Bukkit/Spigot/Paper (Kotlin). Το Codexe δημιουργεί ένα project Gradle με build.gradle.kts, το Paper API, το plugin Shadow για να μπει στο .jar ό,τι δεν παρέχει ο server, και coroutines μέσα στο .jar και με relocate όταν τις χρησιμοποιεί ο κώδικας. Κάνει compile το plugin πριν γίνει Έτοιμο, και τα plugins σε Kotlin δοκιμάζονται σε δοκιμαστικό server και ελέγχονται από δοκιμαστικούς παίκτες όπως και αυτά σε Java. Δες τον generator για plugins σε Kotlin.

«Ένα plugin για Paper 1.21.4 σε Kotlin με το όνομα Bounties: /bounty set <player> <amount> μέσω Vault, ο δολοφόνος παίρνει την ανταμοιβή, το /bounty top δείχνει τα 10 υψηλότερα, αποθήκευση σε SQLite με coroutines για την πρόσβαση στη βάση. Χρησιμοποίησε data classes και extension functions, κράτα τις κλήσεις του Bukkit API στο main thread.»

Ερωτήσεις

Είναι ένα plugin σε Kotlin πιο αργό από ένα plugin σε Java;

Καμία ουσιαστική διαφορά: και τα δύο γίνονται compile σε JVM bytecode. Το .jar είναι μεγαλύτερο όταν περιέχει τη standard library.

Μπορώ να συνδυάσω Java και Kotlin σε ένα plugin;

Ναι, το Gradle κάνει compile και τα δύο στο ίδιο project και ο κώδικας Kotlin καλεί απευθείας κλάσεις Java.

Γιατί NoClassDefFoundError για κλάσεις kotlin;

Η standard library της Kotlin δεν είναι μέσα στο .jar ή δεν φορτώνεται. Κάνε build με shadowJar και εγκατάστησε εκείνο το .jar ή πρόσθεσε τη βιβλιοθήκη στο libraries του plugin.yml.

Φτιάξε ένα plugin σε Kotlin

Αυτό το prompt ανοίγει έτοιμο για αποστολή:

“Ένα plugin για Paper 1.21.4 σε Kotlin με το όνομα Bounties: /bounty set <player> <amount> με την οικονομία του Vault, ο δολοφόνος παίρνει την ανταμοιβή, το /bounty top δείχνει τα 10 υψηλότερα, bounties αποθηκευμένα σε SQLite με coroutines για την πρόσβαση στη βάση, κλήσεις του Bukkit API στο main thread, μηνύματα στο config.yml.”

Φτιάξ' το με το Codexe
Πώς να φτιάξεις ένα Minecraft plugin σε Kotlin (Paper) | Codexe