Guia
Como criar um plugin de Minecraft em Kotlin
Atualizado em 18 de outubro de 2026
O Kotlin roda na JVM, então um plugin em Kotlin usa a mesma API do Paper ou do Spigot, o mesmo plugin.yml e a mesma pasta plugins/ de um plugin em Java. O código é mais curto e tem null safety. A única coisa com que os plugins em Java não precisam se preocupar é a biblioteca padrão do Kotlin: o servidor não a inclui, então o plugin precisa levá-la.
Comece por este exemplo.
Gere isto com o CodexePasso a passo
1.Crie um projeto Gradle com Kotlin DSL
Um
build.gradle.ktscom o pluginkotlin("jvm"), uma toolchain Java que corresponda à sua versão do Minecraft (17, 21 ou 25) e o repositório do PaperMC.2.Adicione a API do servidor
compileOnly("io.papermc.paper:paper-api:<version>"). Como em Java, o servidor a fornece em tempo de execução, então ela nunca é empacotada.3.Escreva a classe principal
class MyPlugin : JavaPlugin()comoverride fun onEnable(). Registre comandos e listeners exatamente como em Java.4.Leve a biblioteca padrão do Kotlin
Empacote-a no .jar com o plugin Shadow ou deixe o servidor baixá-la na inicialização pela lista
librariesdoplugin.yml. Sem uma das duas, o plugin falha comNoClassDefFoundError: kotlin/....5.Escreva o plugin.yml
O mesmo arquivo de um plugin em Java: nome, versão, main (a classe Kotlin),
api-version, comandos e permissões.6.Compile e teste
./gradlew shadowJar(oubuild), copie o .jar debuild/libs/para um servidor de teste e leia o console na inicialização.
Como levar o Kotlin para o servidor
- Faça o shade: o plugin Shadow do Gradle copia a biblioteca padrão do Kotlin e outras bibliotecas de runtime para o seu .jar. Funciona em todas as versões e é a escolha mais comum.
- libraries no plugin.yml: a partir do Spigot 1.16.5, um plugin pode listar bibliotecas do Maven Central que o servidor baixa e carrega para ele. O .jar fica pequeno, mas o servidor precisa de acesso à internet na primeira inicialização.
- Bibliotecas que você adiciona: o kotlinx-coroutines é uma biblioteca separada, não faz parte da biblioteca padrão, e também precisa ser empacotado. Fazer o relocate dele para o seu próprio pacote evita conflitos com outros plugins que empacotam outra versão.
Coroutines e a thread principal
As coroutines são um jeito limpo de carregar dados de um banco de dados sem travar o servidor, mas a API do Bukkit (mundos, entidades, inventários) ainda precisa ser usada na thread principal. Faça o trabalho lento em um dispatcher de segundo plano e depois volte para a thread do servidor com o scheduler antes de mexer no jogo. Vincule o escopo das coroutines ao plugin, para que ele seja cancelado no onDisable().
Java ou Kotlin?
| Recurso | Java | Kotlin |
|---|---|---|
| API | Paper / Spigot | A mesma API do Paper / Spigot |
| Build | Maven ou Gradle | Gradle com build.gradle.kts |
| Extras de runtime | Nenhuma | Biblioteca padrão do Kotlin, empacotada ou carregada |
| Tutoriais e exemplos | A maioria deles | Menos, mas os exemplos em Java se traduzem diretamente |
Com o Codexe
Escolha Bukkit/Spigot/Paper (Kotlin). O Codexe gera um projeto Gradle com build.gradle.kts, a API do Paper, o plugin Shadow para empacotar o que o servidor não fornece e as coroutines empacotadas e realocadas quando o código as usa. Ele compila o plugin antes de ficar Pronto, e os plugins em Kotlin podem ser testados em um servidor de teste e verificados por jogadores de teste como os de Java. Veja o gerador de plugins em Kotlin.
"Um plugin para Paper 1.21.4 em Kotlin chamado Bounties: /bounty set <player> <amount> pelo Vault, quem mata recebe a recompensa, /bounty top mostra as 10 maiores, salvas em SQLite com coroutines para o acesso ao banco de dados. Use data classes e extension functions, mantenha as chamadas da API do Bukkit na thread principal."
Perguntas
Um plugin em Kotlin é mais lento que um plugin em Java?
Não há diferença relevante: os dois compilam para bytecode da JVM. O .jar fica maior quando a biblioteca padrão é empacotada.
Posso misturar Java e Kotlin em um plugin?
Sim, o Gradle compila os dois no mesmo projeto, e o código Kotlin chama as classes Java diretamente.
Por que NoClassDefFoundError para classes kotlin?
A biblioteca padrão do Kotlin não está no .jar ou não foi carregada. Compile com shadowJar e instale esse .jar, ou adicione a biblioteca a libraries no plugin.yml.
Crie um plugin em Kotlin
Este prompt abre pronto para enviar:
“Um plugin para Paper 1.21.4 em Kotlin chamado Bounties: /bounty set <player> <amount> usando a economia do Vault, quem mata recebe a recompensa, /bounty top mostra as 10 maiores, recompensas salvas em SQLite com coroutines para o acesso ao banco de dados, chamadas da API do Bukkit na thread principal, mensagens no config.yml.”
Gere isto com o Codexe