가이드
Kotlin으로 Minecraft 플러그인 만드는 법
2026년 10월 18일 업데이트
Kotlin은 JVM에서 실행되므로, Kotlin 플러그인도 Java 플러그인과 똑같은 Paper 또는 Spigot API, 똑같은 plugin.yml, 똑같은 plugins/ 폴더를 써요. 코드는 더 짧고 null 안전해요. Java 플러그인은 신경 쓰지 않아도 되는 단 한 가지가 Kotlin 표준 라이브러리예요. 서버에 기본으로 들어 있지 않아서 플러그인이 직접 가져와야 해요.
이 예시로 시작하세요.
Codexe로 이걸 생성하기단계별 안내
1.Kotlin DSL로 Gradle 프로젝트 만들기
kotlin("jvm")플러그인, Minecraft 버전에 맞는 Java 툴체인(17, 21, 25), PaperMC 저장소가 들어간build.gradle.kts.2.서버 API 추가하기
compileOnly("io.papermc.paper:paper-api:<version>"). Java와 마찬가지로 실행할 때 서버가 제공하므로 절대 번들하지 않아요.3.메인 클래스 작성
override fun onEnable()이 있는class MyPlugin : JavaPlugin(). 명령어와 리스너는 Java와 똑같이 등록하세요.4.Kotlin 표준 라이브러리 가져오기
Shadow 플러그인으로 .jar 안에 번들하거나,
plugin.yml의libraries목록으로 서버가 시작할 때 내려받게 하세요. 둘 중 하나가 없으면 플러그인이NoClassDefFoundError: kotlin/...로 실패해요.5.plugin.yml 작성
Java 플러그인과 같은 파일이에요: 이름, 버전, main(Kotlin 클래스),
api-version, 명령어, 권한.6.빌드와 테스트
./gradlew shadowJar(또는build)를 실행하고,build/libs/의 .jar를 테스트 서버에 복사한 뒤 시작할 때 콘솔을 읽어 보세요.
서버에 Kotlin 넣기
- 셰이딩하기: Shadow Gradle 플러그인이 Kotlin 표준 라이브러리와 다른 런타임 라이브러리를 .jar 안에 복사해요. 모든 버전에서 작동하고 가장 흔히 쓰는 방법이에요.
- plugin.yml의 libraries: Spigot 1.16.5부터 플러그인은 서버가 내려받아 불러올 Maven Central 라이브러리를 나열할 수 있어요. .jar는 작게 유지되지만, 처음 시작할 때 서버에 인터넷 연결이 필요해요.
- 직접 추가하는 라이브러리: kotlinx-coroutines는 표준 라이브러리가 아닌 별도 라이브러리라서 함께 번들해야 해요. 내 패키지로 리로케이션하면 다른 버전을 번들한 다른 플러그인과 충돌하지 않아요.
코루틴과 메인 스레드
코루틴은 서버를 멈추지 않고 데이터베이스에서 데이터를 불러오는 깔끔한 방법이지만, Bukkit API(월드, 엔티티, 인벤토리)는 여전히 메인 스레드에서 써야 해요. 느린 작업은 백그라운드 디스패처에서 하고, 게임을 건드리기 전에 스케줄러로 서버 스레드로 돌아오세요. 코루틴 스코프를 플러그인에 묶어서 onDisable()에서 취소되게 하세요.
Java인가요, Kotlin인가요?
| 기능 | Java | Kotlin |
|---|---|---|
| API | Paper / Spigot | 똑같은 Paper / Spigot API |
| 빌드 | Maven 또는 Gradle | build.gradle.kts를 쓰는 Gradle |
| 실행에 필요한 추가 요소 | 없음 | 번들하거나 불러오는 Kotlin 표준 라이브러리 |
| 튜토리얼과 예시 | 대부분 | 더 적지만, Java 예시를 그대로 옮길 수 있음 |
Codexe로 하기
Bukkit/Spigot/Paper (Kotlin)을 고르세요. Codexe는 build.gradle.kts, Paper API, 서버가 제공하지 않는 것을 번들하는 Shadow 플러그인이 들어간 Gradle 프로젝트를 생성하고, 코드에서 코루틴을 쓰면 번들하고 리로케이션해요. 준비 완료 전에 플러그인을 컴파일하고, Kotlin 플러그인도 Java 플러그인처럼 테스트 서버에서 체험하고 테스트 플레이어가 확인할 수 있어요. Kotlin 플러그인 생성기를 참고하세요.
"Bounties라는 Kotlin으로 작성한 Paper 1.21.4 플러그인: Vault를 통한 /bounty set <player> <amount>, 처치한 플레이어가 보상을 받음, /bounty top으로 상위 10개 표시, 데이터베이스 접근에 코루틴을 쓰고 SQLite에 저장. 데이터 클래스와 확장 함수를 쓰고, Bukkit API 호출은 메인 스레드에서."
질문
Kotlin 플러그인은 Java 플러그인보다 느린가요?
의미 있는 차이는 없어요. 둘 다 JVM 바이트코드로 컴파일돼요. 표준 라이브러리를 번들하면 .jar가 더 커져요.
하나의 플러그인에서 Java와 Kotlin을 섞어 쓸 수 있나요?
네, Gradle이 같은 프로젝트에서 둘 다 컴파일하고, Kotlin 코드는 Java 클래스를 바로 호출해요.
kotlin 클래스에서 NoClassDefFoundError가 나는 이유는 무엇인가요?
Kotlin 표준 라이브러리가 .jar 안에 없거나 불러오지 않았기 때문이에요. shadowJar로 빌드해서 그 .jar를 설치하거나, plugin.yml의 libraries에 라이브러리를 추가하세요.
Kotlin 플러그인 만들기
이 프롬프트는 바로 보낼 수 있는 상태로 열려요:
“Bounties라는 Kotlin으로 작성한 Paper 1.21.4 플러그인: Vault 경제를 쓰는 /bounty set <player> <amount>, 처치한 플레이어가 보상을 받음, /bounty top으로 상위 10개 표시, 현상금은 데이터베이스 접근에 코루틴을 쓰는 SQLite에 저장, Bukkit API 호출은 메인 스레드에서, 메시지는 config.yml에.”
Codexe로 이걸 생성하기