Kobins 7e61baba5cec465d89e9b4c5615ae13e
강좌 자바 에디션(JE) 플러그인 개발
[마시자] 마인크래프트로 시작하는 Java 0강 - JDK 설치 / IntelliJ IDEA 설치 / Paper API 가져오기
분야 | 플러그인 |
---|---|
장르 | 개발자 툴 |
게임버전 | 모든버전 |
API | 스피곳, 페이퍼 |
자료글 | http://jetbrains.com/ko-kr/idea/download/ |
마인크래프트로 시작하는 Java 0강 목차
IntelliJ IDEA 설치 / JDK 설치 / Paper API 가져오기
제목의 의도는?
저는 마인크래프트가 Java를 입문하기 좋은 플랫폼이라고 생각합니다. 물론 그저 간단한 콘솔 프로그래밍으로 (System.out.println(...)
과 같은) 시작하는 것도 기초를 닦는 과정이기에 나쁘지 않다고 생각합니다.
하지만 콘솔창으로 배우는 것은 조금 심심합니다. 가장 심플하지만 너무 심플해서 흥미도가 낮습니다. 프로그래밍을 시작하는 데에 진입장벽으로 작용하는 것 같습니다.
마인크래프트는 다릅니다. 귀찮은 기반 작업과 여러가지 제약이 존재하지만, 내가 하던 게임을 마음대로 조작할 수 있습니다. 낮아질 수 있는 흥미도를 끌어올리는 데 좋은 수단입니다. 얕은 지식으로도 잘 갖춰진 라이브러리를 통해 생각하던 대로 작동시킬 수 있습니다.
강좌를 들어가기 전
- 저는 전문가가 아닙니다.
- 따라서 내용에 실수, 오류가 있을 수 있으며 지나가는 고수들의 피드백을 바랍니다.
- IntelliJ를 설치하는 과정에서 생략된 과정이 있을 수 있으며(다 지우고 설치하긴 했는데...) 그에 대한 내용을 제보 바랍니다..
- https://blog.naver.com/stageroad0820/220870860325 - 제가 배운 블로그입니다. 여기도 들러보시면 좋을 것 같습니다.
- https://wikidocs.net/book/31 - 위 블로그와 함께 아주 간단한 자바 기초 개념으로 참고하기 좋은 무료 강좌사이트 입니다.
- 이 강좌글의 내용을 맹신하지 마시고, 오류가 있는 것 같으면 망설이지 말고 제보해주시기 바랍니다..
- 강좌의 타겟은 분명 개발을 처음 시작하는 사람인데, 어쩌다 보니 생략된 부분이 존재할 수 있습니다. 그런 부분도 제보 바랍니다.
JDK (Java Development Kit) 설치하기
Q. ㅖ...? 자바는 이미 제 컴퓨터에 깔려있는 것 같은데요?
A. 개발을 처음 경험해보는 컴퓨터에는 대부분 JRE (Java Runtime Environment)가 깔려 있을 것입니다. JDK는 자바 프로그램을 개발하기 위한 기반입니다.
JDK 설치 사이트 : https://www.oracle.com/technetwork/java/javase/downloads/index.html
주의 : 오라클 사의 정책이 바뀌어 JDK를 다운로드 하기 위해서 회원가입이 필요합니다. 오라클 사의 JDK 말고 OpenJDK라는 대안도 있으니 구글에 검색해서 찾아보세요.
하;;
대충 만들어 줍시다. (특정 인물에 대한 비하 의도가 없습니다.)
로그인하면 다운로드 됩니다.
IntelliJ IDEA 설치하기
IntelliJ IDEA 설치 사이트 : https://www.jetbrains.com/ko-kr/idea/
대부분 편의성에 관한 내용입니다.
1 : 바탕화면에 바로가기 추가하기 (64-bit 런처로 시작하는 바로가기 추가)
2 : 대화상자 메뉴 (탐색기[폴더창]에서 우클릭)에서 Open Folder as Project(폴더를 프로젝트로 열기) 메뉴 추가
3 : .java, .groovy, .kt 에 대한 확장자 연결을 추가 (해당파일 더블클릭 시 IntelliJ로 열림)
4 : PATH에 런처 경로 추가 (???)
조오금 시간 걸림
위의 Previous version은 제가 이걸 한 번 지웠다가 다시 깔았기 때문에 남아있는 설정을 불러오는 기능입니다.
개인차는 있으나 대부분 Darcula 하더라구요. 눈에 편함 ㅎㅎ;
첫 프로젝트 만들기
Q. ??? 진도가 너무 빠릅니다. 프로젝트는 뭐고 패키지는 뭡니까?
- 프로젝트(Project)는 간단하게 말하면 여러분이 만들 플러그인에 대한 모든 정보, 소스 코드를 담는 하나의 단위입니다.
또한, IntelliJ는 하나의 창에 하나의 프로젝트밖에 담지 못합니다.
하지만 프로젝트 하나로 여러 플러그인(jar 파일?)을 만들 수 있도록 모듈(Module)이라는 기능도 지원하고 있습니다.
- 패키지(Package)는 프로젝트 중 소스 코드를 용도, 내용에 맞게 분류하는 '폴더'의 역할을 합니다.
패키지의 이름은 꼴리는 대로 하시면.... 다른 사람이 당신의 프로젝트를 열람하는 데 거부 의사를 표출할 수 있습니다.
<패키지 명명 규칙>
- 가급적 대문자는 사용하지 않는 게 좋습니다.
- 프로젝트를 만든 사람(단체)의 사이트 도메인의 맨 끝부터 시작합니다.
(중복 방지를 피하기 위해 가장 중복이 없는 도메인을 사용)
- com.google.~~~
- org.bukkit.~~~
- net.minecraft.server.~~~ - 하지만 우리와 같은 개인들은 도메인 같은 것이 없을 것입니다.
따라서 개인의 경우는 me.<닉네임>.~~~ 으로 하는 경우가 있습니다. - 굳이 자신의 사이트가 아니더라도 com.<닉네임>.~~~ 처럼 사용해도 무방합니다.
(단 닉네임이 사이트 주소와 일치하는 경우 나중에 해당 라이브러리를 가져올 때 불편함을 겪을 수 있습니다.) - 서버 전용 플러그인을 개발한다면 자신의 서버 주소 도메인을 사용하는 것도 좋을 것 같습니다. (kr.kro.~~~)
- 점 (.)으로 구분합니다. (실제 프로젝트 생성 시 ~~/src/me/kobins/... 와 같은 경로로 구성됨)
굳이 규칙을 따르지 않아도 되지만, 그냥 습관처럼 지키는 것이 좋습니다. 나중에 질문글 올릴 때 패키지 구성이 이상하면 원하는 답변을 받지 못하고 괜히 패키지 이름으로 지적받는 일이 생길 수 있습니다. (물론 플러그인 개발자들 인성이 다 그렇게 쓰레기인 것은 아닙니다)
패키지 이름이 me.kobins일 경우에 위와 같이 폴더가 생성됩니다.
D:/[JAVA]/MSJ는 아까 위에서 설정한 프로젝트의 경로이며,
src는 해당 프로젝트에서 소스 코드를 담는 폴더,
me/kobins는 우리가 설정한 패키지 이름을 기준으로 생성된 폴더들입니다.
Q. 클래스는 무엇입니까?
A. 사실 깊게 설명하면 객체지향 개념까지 설명해야 하지만, 지금 부분에서는 간단하게 소스 코드 파일 하나 단위 라고만 설명해 두겠습니다. 실제 소스 코드에서는 .java 파일[수정 가능, 원본 소스]로 생성되며, 빌드(컴파일) 후에는 .class[수정 불가능, 실행 소스] 파일로 변환됩니다.
클래스에도 이름을 짓는 방법이 있습니다.
- 영어로 작성하자. (설마 해서 적어놓음)
- 맨 처음은 대문자로 시작한다.
- 띄어쓰기는 사용하지 않는다.
- 단어를 대문자로 시작한다.
- 만약에 null pointer exception이라는 이름을 쓰고 싶다면 NullPointerException이라는 이름으로 바꾸어야 한다.
- diamond is unbreakable 이라는 이름도 DiamondIsUnbreakable이라는 이름으로. - 언더바(_)를 사용하지 않는다. (더러워진다.)
또한 띄어쓰기 룰 제외하고는 필수는 아니지만, 패키지 이름과 마찬가지로 질문 대답을 받지 못하고 클래스 이름이 왜 그 꼬라지냐 하는 지적을 받을 수 있으니 지켜줍시다.
첫 클래스를 만들었습니다. 와!
하지만 이것으로는 아직 플러그인을 만들 수 없습니다 ...
Paper API 가져오기 (1.15.2)
지금부터 설명할 내용은 거의 꼼수에 가깝습니다. 사실 공식 사이트에서 평범하게 jar 파일로 가져오는 방법을 설명해줄 처지도 아니지만(후술...), 킹직히 너무 불편한 것 같습니다.
만약 Paper가 아닌 순수 BuildTools 또는 외부 미러를 통해 spigot ~~~.jar 파일을 가지고 개발하실 분들은 중간에 jar 파일을 연결하는 부분에서부터 똑같이 해 주시면 되겠습니다.
왜 이 짓을 해야하는가? (이 부분은 생략해도 됨)
플러그인은 사실 마인크래프트에 원래 존재하는 개념이 아닙니다. 애초에 마인크래프트 서버 자체도 확장을 염두에 둔 구조가 아닌 것 같습니다.
양심이 없거든요. 후... 개빡치네 쓰다보니 NMS야발...
아무튼 그런 서버 기반(Minecraft_Server.jar)을 어떻게든 씹고 뜯고 맛보고 해서 어떤 Java 잘하는 사람이 만든 API가 바로 Bukkit에 해당합니다. 그리고 Bukkit에서는 서버를 원하는 대로 모딩(Modification) 할 수 있도록 플러그인이라는 기능을 제공하죠!
또, Bukkit을 그대로 가져와 최적화를 더한 것이 Spigot이며, 기존에는 대부분 Bukkit 또는 Spigot으로 개발 해 왔습...니다만
정식 1.7 버전에서 1.8 버전으로 넘어가는 과정 중에 버킷 팀 인원과 모장 사이에 정책(EULA...) 관련해서 DMCA 문제(대충 저작권)가 터지면서 더 이상 Bukkit과 이를 기반으로 한 Spigot을 만들기 힘들게 되었습니다. (자세한 건 킹무갓키로...)
아무튼 어찌저찌 해서 나온 새로운 Spigot 기반의 API인 Paper가 등장했습니다. 저작권 문제를 적당히 회피하여 공식 사이트에서 다운받을 수 있지요!
Paper API 준비하기
- Paper 서버 기반 파일 다운로드 : https://papermc.io/downloads
1.15.2의 가장 최신 빌드가 #120이네요. 왼쪽의 구름 버튼을 눌러 다운받아 줍시다.
대충 서버 파일을 둘 장소에 저장합시다.
Q. 어? 잠깐? 나 왜 서버를 여는 준비를 하고 있는 것 같지요?
A. 사실 맞습니다. 안타깝게도 평범하게 jar 파일을 라이브러리로 쓰는 방법은 paper.jar 파일로 불가능합니다.
하지만 Paper가 서버를 열면서 한가지 동작을 하는데, 그것은 바로 모장에서 제공하는 Minecraft_Server.jar 파일을 Paper로 다시 패치하여 실제로 Paper 서버를 돌리는 기반을 만드는 것입니다.
즉, paper.jar는 실제 CraftBukkit, Spigot의 내용이 아닌 그 패치 내용을 담고 있는 것입니다! 그래서 우리는 paper.jar을 그대로 API로서 활용할 수 없지요.
따라서 서버를 한번 열어 이 과정을 한번 해 준 후, 패치된 파일을 jar 라이브러리로서 활용하면 이전에 spigot을 가지고 개발하던 것 처럼 플러그인 개발이 가능해집니다!
.서버열기.bat
@echo off
title 서버
java -Xms1024M -Xmx1024M -jar paper.jar --nogui
pause
글을 쓰다보니 다운로드가 되었군요. 적절한 배치 파일을 준비 해 줍시다.
서버를 열고 조금 기다리면 Downloading vanilla jar...
메세지와 Patching vanilla jar...
메세지 이후 바로 서버가 열리려는 모습이 보일겁니다. (그리고 eula.txt를 동의하라면서 바로 서버를 닫아버립니다)
그리고!!! 같은 서버 폴더에 보면 cache 폴더가 생성되어 있는 것을 볼 수 있는데 !!!!
와! 여기 있군요! 우리가 찾던 바로 그 파일입니다. 이제 이 녀석을 IntelliJ 프로젝트에 라이브러리로 등록 해 줍시다.
프로젝트를 우클릭하고 모듈 설정을 열어줍시다.
Libraries 탭 -> + 버튼을 눌러 Java를 선택 해 줍시다.
(바로 갱신이 되지 않을 때도 있으니...) 새로고침을 한번 눌러준 후 경로를 찾아 patched_1.15.2.jar 를 클릭하고 OK를 눌러줍시다.
WA! 이제 Paper (Spigot (Bukkit)) 라이브러리가 우리 손 안에 들어와 플러그인 개발을 시작할 수 있게 되었습니다!
API도 생긴 김에 이제 플러그인 강좌 국룰인 onEnable과 onDisable에 메세지 띄우기를 해볼까요?
플러그인 강좌 국룰 해보기 아직 내용 이해까진 안 해도 됨
처음에 만든 Main 클래스에 오른쪽에 extends JavaPlugin
을 붙여줍시다.
이게 뭐 하는 짓이냐구요? 객체지향 개념 중 하나인 상속으로 부모 클래스의 속성을 자식 클래스에 적용시켜 부모 클래스가 할 수 있는 일을 그대로 물려받아 기능을 확장하는 개념 중 하나인데 ...
... 는 나중에 다뤄보도록 하죠. 이제 막 시작한(아마?) 여러분들에게는 조오금 벅찬 과정일 수 있습니다.
다른 언어에서 오신 분들도 있을까 싶어 말해두지만 그냥 Paper(Spigot(Bukkit)) API에서 메인 클래스로 인식할 수 있도록 JavaPlugin 클래스를 상속 시켜주는겁니다. 처음 시작하신 분들은 이 내용은 넘겨 들으셔도 됩니다.
어? 근데 빨간색이 뜨죠? 대체 뭐가 문제인가요? 분명 라이브러리도 추가했는데?
마우스를 한번 빨간색 위에 올려봅시다.
Q. JavaPlugin 이라는 기호를 알아먹을 수 없다는 데, 지금 저한테 약파는 건가요?
A. ㅎㅎ; 사실 어떤 언어든(아마?) 외부 라이브러리를 프로젝트에 가져왔다고 해서 바로 써먹을 수 있는 건 아닙니다.
바로 import 라는 기능이 필요하지요.
import란?
외부 라이브러리, 또는 자바 내장 라이브러리에서 외부 클래스를 이 코드에서 사용(참조)할 수 있도록 하는 명령.
... 이라고 하면 너무 딱딱한데, 요약하면 Paper API 내에 어딘가에 있는 JavaPlugin 이라는 클래스 내용을 우리가 이 코드에 쓰겠다고 Java에게 선언하는겁니다. 즉, 라이브러리에 아무리 jar 파일을 가져와도 import를 하지 않는다면 아무것도 할 수가 없습니다!
아무튼, 일단 저 사진의 밑에 있는 Import class를 눌러봅시다.
오, 뭐가 생겼네요? 우리 Intellectual한 IntelliJ는(사실 대부분의 IDE도 이정도는 합니다 ㅎㅎ) 대충 해당되는 클래스 이름을 입력하면 알아서 클래스가 위치한 패키지(여기서 나오네요!)를 찾아 자동으로 import 해줍니다.
보시면 알겠지만 대부분의 Paper(Spigot(Bukkit)) API의 클래스는 org.bukkit
패키지 내부에 위치하고 있습니다.
이제 Main 클래스는 JavaPlugin의 속성을 지닙니다. 즉, 이제 플러그인의 메인 클래스로서 사용할 수 있다는 뜻입니다.
Q. 메인 클래스?
Bukkit은 서버를 열면 자동으로 서버 폴더\plugins\ 내에 있는 모든 .jar 파일들을 검사합니다. 그리고 후술할 plugin.yml 파일의 정보를 토대로 JavaPlugin을 상속한 클래스를 찾게 되는데, 이것이 메인 클래스입니다.
plugin.yml 설정은 조금 이따가 다루기로 하고, 일단은 서버가 켜질 때와 꺼질 때, 콘솔에 메세지가 가도록 해 봅시다!
서버가 켜질 때 메세지 띄우기
두 중괄호 사이에 공간을 넉넉~ 하게 만들어 주신 후, 그 빈 공간에 onenable
을 써 보면 저런 모습이 뜰 겁니다.
저 상태에서 엔터를 누르면...
와! 이런 모양새가 나왔네요!
IntelliJ의 기능 중 하나인데, 알아서 부모 클래스의 기능을 Override하는 메소드를 자동으로 작성해 주는 기능입니다.
뭐, 자세히 알 필요는 없고, 저 드래그 된 부분을 잠시 지워두고, 우리가 원하는 내용을 써 봅시다.
여기서부터 콘솔에 메세지를 띄우는 방법이 강좌마다 다르던데, 일단 Logger 클래스를 활용하는 방법으로 가 보겠습니다.
잠깐 onEnable 안의 중괄호를 나와, 다시 Main 안의 중괄호 공간에 Logger logger = getServer().getLogger();
를 작성해봅시다.
오, Logger만 쳐도 뭐가 바로 나오네요. 엔터를 눌러 import 해 줍시다.
짜잔, 쓰던 거 계속 써 줍시다.
이름까지 자동으로 제안해주는 갓-IntelliJ
알아서 찾아주네요. 엔터!
이제 우리는 다른 플러그인에서 보던 것처럼 INFO, WARN, ERROR를 구분해서 콘솔에 메세지를 띄울 수 있습니다.
어떻게 하냐구요?
바로 이렇게! logger.info("MSG 플러그인 활성화");
를 작성 해 주세요. 이러면 매 번 서버가 켜질 때(정확히는 이 플러그인이 가져와질 때) MSJ 플러그인 활성화라는 메세지가 나올겁니다.
꺼질 때 메세지 띄우는것도 비슷합니다.
와! 이제 끌 때도 MSJ 플러그인 비활성화 라는 메세지가 나오겠네요!
plugin.yml 작성하기
음... 근데 대충 기능은 다 작성한 것 같은데, 생각해보니 과연 Paper가 이렇게만 해서 우리 플러그인을 인식할 수 있을 것 같나요?
아마도 그랬다면 Paper가 서버를 시작할 때 대규모 플러그인의 경우는 모든 클래스를 다 뒤지느라 부팅하는 데에만 10분이 걸렸을 것 같은데... 그건 아닌 것 같죠?
따라서 Paper가 우리의 플러그인을 인식할 수 있도록 플러그인의 기본적인 정보를 담는 plugin.yml 파일을 작성 해 봅시다!
일단 폴더를 하나 만들어 줍시다. 프로그램 소스 외에 여러가지 파일을 담을 공간의 목적입니다.
resources 라는 이름으로 만들어줍시다.
파일을 하나 생성해 줄 겁니다.
plugin.yml 이라는 이름으로 하나 파일을 만들어 줍시다. 엔터!
펼쳐진 공허한 공간 ...
우리는 여기에 플러그인에 필요한 기본 정보들을 담을 것입니다.
그럼 대체 플러그인에 필요한 기본 정보가 뭐냐?
name: MSJ
version: 1.0
main: me.kobins.Main
api-version: 1.15
name과 version은 그냥 평범한 문자열로 각각 플러그인의 이름과 버전을 적어주시면 됩니다.
main은 위에서 말한 메인 클래스의 경로를 가져오시면 되는데 ...
저기 있는 me.kobins
에다가 뒤에 점.
이랑 클래스 이름 Main
붙이시면 me.kobins.Main
완성!
그리고 최근 버전 오면서 생긴 내용인 api-version: 1.15도 추가해줍시다. (안써주면 Paper가 싫어함)
짜잔~ (노란 음영은 무시해도 됨. String 들어갈 공간에 숫자 썼다고 경고하는 중... 어차피 버전인데...)
그리고 Ctrl+S를 눌러 저장해줍시다!
(※인텔리제이에서는 이것도 자동완성을 해 줍니다. 앙 기모띠)
그럼 진짜로 우리는 Paper 플러그인을 만들 준비가 다 되었습니다! 이제 jar 파일로 뽑으면 되는데...
IntelliJ에는 jar로 추출하기 위해 한 가지 과정이 필요합니다.
Artifact 설정하기
이 기능은 IntelliJ의 모듈을 원하는 형태로 Export할 수 있게 만든 기능입니다.
우리는 Jar 형태로 Export하여 우리 서버에 한번 넣어봐야지요?
아까 들어갔던 모듈 설정을 들어가줍시다.
순서대로 Artifacts -> + 버튼 -> JAR -> Empty를 눌러줍시다.
unnamed라는 친구가 생겼을 텐데, 원하는 이름으로 일단 바꿔줍시다.
음... 좋아요.... 그리고 경로를 설정 해 줍시다. 우리는 플러그인을 수정하고 바로바로 그 결과를 보고싶으니 서버의 플러그인 폴더로 설정 해 줍시다!
저 폴더 모양을 누르면 경로를 지정할 수 있습니다.
아까 대충 페이퍼를 다운받은 폴더나, 아님 따로 구축해둔 서버가 있으면 그 서버 폴더의 plugins에 지정 해 줍시다.
만약에 아까 페이퍼를 다운받은 폴더에 하면 아마 서버를 제대로 열지 않고 와서 plugins 폴더가 없을테니, 위의 폴더 생성 버튼으로 plugins 폴더를 만들어 준 뒤에 OK를 눌러줍시다.
그리고 사진의 화살표를 눌러 저 'MSJ' compile output을 더블클릭 해 봅시다.
짜잔! 이제 우리가 만들 jar 파일에 MSJ 모듈의 내용들이 들어가게 되었습니다.
그리고 우리가 아까 만든 plugin.yml도 jar 파일에 포함시켜 봅시다.
왼쪽의 + 버튼을 눌러 Directory Content 선택
프로젝트 폴더에 들어가 아까 만들어둔 resources 폴더 선택
이제 resources 폴더 안에 있는 모든 친구들은 전부 jar로 만들어질 때 같이 나갑니다.
그리고 그 resources 폴더 안에 plugin.yml 파일을 Paper가 찾아서 플러그인의 정보를 읽고
아까 적어둔 main: me.kobins.Main
의 정보를 토대로 우리의 플러그인을 로드할겁니다!
OK!
이제 우리가 설정한 jar를 진짜로 뽑아낼 시간입니다. Build -> Build Artifacts... 를 눌러주세요! (단축키는 제가 임의로 설정)
Build!!!
좋아요!!!
짜란 !!!!!!!
아까 서버를 열면서 생긴 eula.txt 파일의 내용을 true로 바꿔주고... (이거 안하면 서버 못염)
가즈앗
아주 긴 시간의 월드 생성 후...
아!!!!!!!!!!!!!!!!! 바로 이거야!!!!!!!!!!!!!!!!!!!!
끄면?
이예아!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Kobins
2020.03.20밑에 Redips님이 문의주신것하고 같은 내용입니다 ㅎㅎ; 강좌글 중간에 JDK 버전을 11에서 8로 바꾸는 부분이 있어요. (첫 프로젝트 만들기 부분)
스피드웨건도와줘요
2020.03.22앗 그러네요...ㅎㅎ 근데 그걸 적용하니까 또 다른 오류가 떠서요...ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ
[Server thread/ERROR]: Could not load 'plugins\RPG practice1.jar' in folder 'plugins'
org.bukkit.plugin.InvalidDescriptionException: Invalid plugin.yml
at org.bukkit.plugin.java.JavaPluginLoader.getPluginDescription(JavaPluginLoader.java:159) ~[patched_1.15.2.jar:git-Paper-137]
at org.bukkit.plugin.SimplePluginManager.loadPlugins(SimplePluginManager.java:147) ~[patched_1.15.2.jar:git-Paper-137]
at org.bukkit.craftbukkit.v1_15_R1.CraftServer.loadPlugins(CraftServer.java:358) ~[patched_1.15.2.jar:git-Paper-137]
at net.minecraft.server.v1_15_R1.DedicatedServer.init(DedicatedServer.java:234) ~[patched_1.15.2.jar:git-Paper-137]
at net.minecraft.server.v1_15_R1.MinecraftServer.run(MinecraftServer.java:885) ~[patched_1.15.2.jar:git-Paper-137]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_241]
Caused by: java.io.FileNotFoundException: Jar does not contain plugin.yml
... 6 more
대체 어디서 실수한 것인지 .... 혹시 프로젝트 네임에 띄어쓰기를 써서 그런건가요....?
Kobins
2020.03.22자세히는 모르겠지만 Jar does not contain plugin.yml 라고 뜨는 것을 보면 plugin.yml 작성하기 문단부터 다시보면서 해보시면될것같습니다 (resources 폴더 만들기 -> resources 폴더 안에 plugin.yml 만들고 내용넣기 -> Artifact에서 resources 폴더도 등록하기)
+꿀팁인데 단순한 문제인 경우에는 로그에 오류를 바로 해결할 수 있는 내용이 적혀있는 경우가 많아서 구글번역기 한번 돌려보는것도 나쁘지않음
엠군
2020.03.20오라클의 jdk 대신 zulu 추천드립니다.
의외로 이슈도 없고 환경 설정까지 해줍니다.
나는낫닝겐이닷
2020.03.22접속이 되긴 되는데 다운로드 목록이 비어 있어요
Kobins
2020.03.22이렇게 안뜨신다는것??
나는낫닝겐이닷
2020.03.22네
윈초
2020.03.23JDK 설치 페이지가 바뀐거 같은데.. 저만 그런가요?
세리시아
2020.03.26자바의 j 자도 모르는 초보인데도 뭔가에 홀린 듯 따라하다 보니 신기하게 저게 되네요ㅋㅋ
재밌는 강의 감사합니다!
juyeong
2020.03.26와 대단하네요
여러분안녕하세요안녕하세요안녕하세요
2020.04.28아하 그래서 페이퍼를 라이브러리로 등록하면 임포트가 안되는 거였군요;; 좋은 강좌 감사합니다! 근데 인텔리제이 쓰는것보다는 이클립스가 더 좋지 않을까요..?
Daramjwi
2020.08.301.16.1 버전 스피곳으로 버킷 쓰는 사람입니다
아무리 따라한것을 있는대로 해보니까 플러그인 파일에 안들어가더라고요
이건 어떻게 해결하나요?
dacoev
2020.10.02저 아래와 같이 에러가 뜨는데 무슨 문제일까요?
[23:29:13 ERROR]: Could not load 'plugins/minecraftplugin1.jar' in folder 'plugins'
org.bukkit.plugin.InvalidPluginException: Unsupported API version 1.16.3
at org.bukkit.craftbukkit.v1_16_R2.util.CraftMagicNumbers.checkSupported(CraftMagicNumbers.java:311) ~[patched_1.16.3.jar:git-Paper-209]
at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:133) ~[patched_1.16.3.jar:git-Paper-209]
at org.bukkit.plugin.SimplePluginManager.loadPlugin(SimplePluginManager.java:397) ~[patched_1.16.3.jar:git-Paper-209]
at org.bukkit.plugin.SimplePluginManager.loadPlugins(SimplePluginManager.java:305) ~[patched_1.16.3.jar:git-Paper-209]
at org.bukkit.craftbukkit.v1_16_R2.CraftServer.loadPlugins(CraftServer.java:389) ~[patched_1.16.3.jar:git-Paper-209]
at net.minecraft.server.v1_16_R2.DedicatedServer.init(DedicatedServer.java:204) ~[patched_1.16.3.jar:git-Paper-209]
at net.minecraft.server.v1_16_R2.MinecraftServer.w(MinecraftServer.java:939) ~[patched_1.16.3.jar:git-Paper-209]
at net.minecraft.server.v1_16_R2.MinecraftServer.lambda$a$0(MinecraftServer.java:177) ~[patched_1.16.3.jar:git-Paper-209]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_262]
Kobins
2020.10.24API 1.16.3이 아니라 1.16으로 쓰셔야할겁니다
dacoev
2020.10.261.16는 어떻게 다운 받나요?
허두
2020.12.101.16, 1.16.1, 1.16.2, 1.16.3, 1.16.4 모두 api 버전은 1.16이라고 표기해야 합니다.
dacoev
2020.12.11감사합니다
질문이요!
2020.10.08[21:41:40 ERROR]: Could not load 'plugins\molangyeeda.jar' in folder 'plugins'
org.bukkit.plugin.InvalidDescriptionException: name:molangyeeda version:1.0 main:me.bbi_yak.yeegut.main api-version:1.16 is not properly structured.
at org.bukkit.plugin.PluginDescriptionFile.asMap(PluginDescriptionFile.java:1220) ~[patched_1.16.3.jar:git-Paper-220]
at org.bukkit.plugin.PluginDescriptionFile.<init>(PluginDescriptionFile.java:252) ~[patched_1.16.3.jar:git-Paper-220]
at org.bukkit.plugin.java.JavaPluginLoader.getPluginDescription(JavaPluginLoader.java:167) ~[patched_1.16.3.jar:git-Paper-220]
at org.bukkit.plugin.SimplePluginManager.loadPlugins(SimplePluginManager.java:148) ~[patched_1.16.3.jar:git-Paper-220]
at org.bukkit.craftbukkit.v1_16_R2.CraftServer.loadPlugins(CraftServer.java:389) ~[patched_1.16.3.jar:git-Paper-220]
at org.bukkit.craftbukkit.v1_16_R2.CraftServer.reload(CraftServer.java:938) ~[patched_1.16.3.jar:git-Paper-220]
at org.bukkit.Bukkit.reload(Bukkit.java:699) ~[patched_1.16.3.jar:git-Paper-220]
at org.bukkit.command.defaults.ReloadCommand.execute(ReloadCommand.java:54) ~[patched_1.16.3.jar:git-Paper-220]
at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:159) ~[patched_1.16.3.jar:git-Paper-220]
at org.bukkit.craftbukkit.v1_16_R2.CraftServer.dispatchCommand(CraftServer.java:802) ~[patched_1.16.3.jar:git-Paper-220]
at org.bukkit.craftbukkit.v1_16_R2.CraftServer.dispatchServerCommand(CraftServer.java:764) ~[patched_1.16.3.jar:git-Paper-220]
at net.minecraft.server.v1_16_R2.DedicatedServer.handleCommandQueue(DedicatedServer.java:405) ~[patched_1.16.3.jar:git-Paper-220]
at net.minecraft.server.v1_16_R2.DedicatedServer.b(DedicatedServer.java:372) ~[patched_1.16.3.jar:git-Paper-220]
at net.minecraft.server.v1_16_R2.MinecraftServer.a(MinecraftServer.java:1211) ~[patched_1.16.3.jar:git-Paper-220]
at net.minecraft.server.v1_16_R2.MinecraftServer.w(MinecraftServer.java:999) ~[patched_1.16.3.jar:git-Paper-220]
at net.minecraft.server.v1_16_R2.MinecraftServer.lambda$a$0(MinecraftServer.java:177) ~[patched_1.16.3.jar:git-Paper-220]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_261]
+
어제만 이상했나봐요 또 띄어 썻는데도 매핑오류가 안나네요
이 오류는 구글링을 해도 명확하게 안나와서 질문드립니다.
Kobins
2020.10.24plugin.yml 파일을 ㅜ먼가 잘못작성하신 것 같습니다.
name, version, main이 같은 줄에 있는 것 같습니다.. 글에 사진에 나온것처럼 작성해주세요
플러그인개발이고픈닝겐
2020.10.161.12.2버전은 어떻게 만들어야하나요.