모드 커뮤니티

이 게시판에 글을 승인 없이 바로 작성하시려면 인증 개발자 권한이 필요합니다. 언제든지 지원해주세요(바로가기).

플러그인

[마시자] 마인크래프트로 시작하는 Java 0강 - JDK 설치 / IntelliJ IDEA 설치 / Paper API 가져오기

Kobins 2020.02.26 조회 수 385 추천 수 3

4a182932b8728e287affadf3f6c385bd.png

마인크래프트로 시작하는 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라는 대안도 있으니 구글에 검색해서 찾아보세요.

92b3ca94f33701a014d561d63b5a06a4.png

dfdf751a4a8e487677915db417f082e3.png

227a9a924a2181fb0b224bde1b14c072.pnge2beb3437078736d2c380709d0134a72.png

하;;

75c85e74a19bd19ed2c7ac73a851fcd5.png

대충 만들어 줍시다. (특정 인물에 대한 비하 의도가 없습니다.)

로그인하면 다운로드 됩니다.

d4b6d77e091079e562314969ee7dc467.png

73ff9b1d78f879131cb41ca2fa34d679.png

cd7d128ae957ad5345d5123043b9a487.png

IntelliJ IDEA 설치하기

IntelliJ IDEA 설치 사이트 : https://www.jetbrains.com/ko-kr/idea/

3b82b1b55475bbba0fb08ea75ee074c2.png

3695aae55b0f19a81cd3a39acef5e7cb.png

5857d9f5d5da48ee546bdf251ff23d39.png

6eafee6899169a2201e8629fbf8583cb.png

4b1cc9ca93a89d55ba10ea403cfc0f31.png

대부분 편의성에 관한 내용입니다.

1 : 바탕화면에 바로가기 추가하기 (64-bit 런처로 시작하는 바로가기 추가)
2 : 대화상자 메뉴 (탐색기[폴더창]에서 우클릭)에서 Open Folder as Project(폴더를 프로젝트로 열기) 메뉴 추가
3 : .java, .groovy, .kt 에 대한 확장자 연결을 추가 (해당파일 더블클릭 시 IntelliJ로 열림)
4 : PATH에 런처 경로 추가 (???)

72e2fd74f85a52e776cc1a0bf458fcf3.png

66d1bf55558b601a55745cb0b0906296.png

조오금 시간 걸림

833415f558a164dc4b3f94c0d6abc339.png6a568ec79cb1ba5efb20e68601b80a65.png

1c1d847300e3e1124c53be44f239bf8a.png

위의 Previous version은 제가 이걸 한 번 지웠다가 다시 깔았기 때문에 남아있는 설정을 불러오는 기능입니다.

4621289ade3e9e89b176e80accfa9f90.png

개인차는 있으나 대부분 Darcula 하더라구요. 눈에 편함 ㅎㅎ;

첫 프로젝트 만들기

97c8c50ffa307f53140bb9b635c13642.png

96fffe259838c6b7c8c5c2db4e94cb4d.png

cf76cfa82aa44810f3b9363b0b2aa2dd.png

ba738b51e1a3f2ba481e3f5677782aaf.png

3a16fe876e95b20b4c749fe73eadf048.png

001d05b73de80cb4dba37c2bec94825c.png

49d0bbf816aa62a933f8a9684927e079.png

Q. ??? 진도가 너무 빠릅니다. 프로젝트는 뭐고 패키지는 뭡니까?

- 프로젝트(Project)는 간단하게 말하면 여러분이 만들 플러그인에 대한 모든 정보, 소스 코드를 담는 하나의 단위입니다.
또한, IntelliJ는 하나의 창에 하나의 프로젝트밖에 담지 못합니다.
하지만 프로젝트 하나로 여러 플러그인(jar 파일?)을 만들 수 있도록 모듈(Module)이라는 기능도 지원하고 있습니다.

- 패키지(Package)는 프로젝트 중 소스 코드를 용도, 내용에 맞게 분류하는 '폴더'의 역할을 합니다.

0213dd3cd43ee2f3ec4f6b7a68864a1e.png

패키지의 이름은 꼴리는 대로 하시면.... 다른 사람이 당신의 프로젝트를 열람하는 데 거부 의사를 표출할 수 있습니다.

<패키지 명명 규칙>

  1. 가급적 대문자는 사용하지 않는 게 좋습니다.
  2. 프로젝트를 만든 사람(단체)의 사이트 도메인의 맨 끝부터 시작합니다.
    (중복 방지를 피하기 위해 가장 중복이 없는 도메인을 사용)
    - com.google.~~~
    - org.bukkit.~~~
    - net.minecraft.server.~~~
  3. 하지만 우리와 같은 개인들은 도메인 같은 것이 없을 것입니다.
    따라서 개인의 경우는 me.<닉네임>.~~~ 으로 하는 경우가 있습니다.
  4. 굳이 자신의 사이트가 아니더라도 com.<닉네임>.~~~ 처럼 사용해도 무방합니다.
    (단 닉네임이 사이트 주소와 일치하는 경우 나중에 해당 라이브러리를 가져올 때 불편함을 겪을 수 있습니다.) 
  5. 서버 전용 플러그인을 개발한다면 자신의 서버 주소 도메인을 사용하는 것도 좋을 것 같습니다. (kr.kro.~~~)
  6. 점 (.)으로 구분합니다. (실제 프로젝트 생성 시 ~~/src/me/kobins/... 와 같은 경로로 구성됨)

굳이 규칙을 따르지 않아도 되지만, 그냥 습관처럼 지키는 것이 좋습니다. 나중에 질문글 올릴 때 패키지 구성이 이상하면 원하는 답변을 받지 못하고 괜히 패키지 이름으로 지적받는 일이 생길 수 있습니다. (물론 플러그인 개발자들 인성이 다 그렇게 쓰레기인 것은 아닙니다)

76461c2a940f51b24e49093d63f83f32.png

패키지 이름이 me.kobins일 경우에 위와 같이 폴더가 생성됩니다.

D:/[JAVA]/MSJ는 아까 위에서 설정한 프로젝트의 경로이며,
src는 해당 프로젝트에서 소스 코드를 담는 폴더,
me/kobins는 우리가 설정한 패키지 이름을 기준으로 생성된 폴더들입니다.

953db7a2cceb0b95b7cd2096a014e668.png

Q. 클래스는 무엇입니까?

A. 사실 깊게 설명하면 객체지향 개념까지 설명해야 하지만, 지금 부분에서는 간단하게 소스 코드 파일 하나 단위 라고만 설명해 두겠습니다. 실제 소스 코드에서는 .java 파일[수정 가능, 원본 소스]로 생성되며, 빌드(컴파일) 후에는 .class[수정 불가능, 실행 소스] 파일로 변환됩니다.

3d8c51cd8b5a322a53fe1e2b62648cc2.png

클래스에도 이름을 짓는 방법이 있습니다.

  1. 영어로 작성하자. (설마 해서 적어놓음)
  2. 맨 처음은 대문자로 시작한다.
  3. 띄어쓰기는 사용하지 않는다.
  4. 단어를 대문자로 시작한다.
    - 만약에 null pointer exception이라는 이름을 쓰고 싶다면 NullPointerException이라는 이름으로 바꾸어야 한다.
    - diamond is unbreakable 이라는 이름도 DiamondIsUnbreakable이라는 이름으로.
  5. 언더바(_)를 사용하지 않는다. (더러워진다.)

또한 띄어쓰기 룰 제외하고는 필수는 아니지만, 패키지 이름과 마찬가지로 질문 대답을 받지 못하고 클래스 이름이 왜 그 꼬라지냐 하는 지적을 받을 수 있으니 지켜줍시다.

43af754eabefdd6bf0fc6087ddeff05c.png

첫 클래스를 만들었습니다.  와!


하지만 이것으로는 아직 플러그인을 만들 수 없습니다 ...


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 

1b0836a108b5802c3f3752fc9375403a.png

 1.15.2의 가장 최신 빌드가 #120이네요. 왼쪽의 구름 버튼을 눌러 다운받아 줍시다.

6258fcdfd7a801df76ebc3c80dcb44a5.png

대충 서버 파일을 둘 장소에 저장합시다.

Q. 어? 잠깐? 나 왜 서버를 여는 준비를 하고 있는 것 같지요?

A. 사실 맞습니다. 안타깝게도 평범하게 jar 파일을 라이브러리로 쓰는 방법은 paper.jar 파일로 불가능합니다.

하지만 Paper가 서버를 열면서 한가지 동작을 하는데, 그것은 바로 모장에서 제공하는 Minecraft_Server.jar 파일을 Paper로 다시 패치하여 실제로 Paper 서버를 돌리는 기반을 만드는 것입니다.

즉, paper.jar는 실제 CraftBukkit, Spigot의 내용이 아닌 그 패치 내용을 담고 있는 것입니다! 그래서 우리는 paper.jar을 그대로 API로서 활용할 수 없지요.

따라서 서버를 한번 열어 이 과정을 한번 해 준 후, 패치된 파일을 jar 라이브러리로서 활용하면 이전에 spigot을 가지고 개발하던 것 처럼 플러그인 개발이 가능해집니다!

1d0ff7a82f5102e01d8f55b412840f0a.png

.서버열기.bat

@echo off
title 서버
java -Xms1024M -Xmx1024M -jar paper.jar --nogui
pause

글을 쓰다보니 다운로드가 되었군요. 적절한 배치 파일을 준비 해 줍시다.

0c413696da7a08a71363f54c97f2ebb2.png

서버를 열고 조금 기다리면 Downloading vanilla jar... 메세지와 Patching vanilla jar... 메세지 이후 바로 서버가 열리려는 모습이 보일겁니다. (그리고 eula.txt를 동의하라면서 바로 서버를 닫아버립니다)

b709d8769ec0f57845a51afcb3126530.png

그리고!!! 같은 서버 폴더에 보면 cache 폴더가 생성되어 있는 것을 볼 수 있는데 !!!!

25f7bc0e5f66542adb0f99ffb4821b7f.png

와! 여기 있군요! 우리가 찾던 바로 그 파일입니다. 이제 이 녀석을 IntelliJ 프로젝트에 라이브러리로 등록 해 줍시다.

2cfab6dc590b6d4e0ab61f37f90bca28.png

프로젝트를 우클릭하고 모듈 설정을 열어줍시다.

3b0f9d21536b65575af82362f0f11696.png

Libraries 탭 -> + 버튼을 눌러 Java를 선택 해 줍시다.

5700dfe9694f8036ea8e65ed21d704ba.png

(바로 갱신이 되지 않을 때도 있으니...) 새로고침을 한번 눌러준 후 경로를 찾아 patched_1.15.2.jar 를 클릭하고 OK를 눌러줍시다.

3bf2c990a022602aa8c810ac5e976001.pnga0ee3fda6ca28c4ee8cf1be336156265.png

62df0002eaa1d90deef9a1b05c9d0e35.png

WA! 이제 Paper (Spigot (Bukkit)) 라이브러리가 우리 손 안에 들어와 플러그인 개발을 시작할 수 있게 되었습니다!

API도 생긴 김에 이제 플러그인 강좌 국룰인 onEnable과 onDisable에 메세지 띄우기를 해볼까요?


플러그인 강좌 국룰 해보기 아직 내용 이해까진 안 해도 됨

6c7eab470d1974c680ec26ec671b6976.png

처음에 만든 Main 클래스에 오른쪽에 extends JavaPlugin 을 붙여줍시다.

이게 뭐 하는 짓이냐구요? 객체지향 개념 중 하나인 상속으로 부모 클래스의 속성을 자식 클래스에 적용시켜 부모 클래스가 할 수 있는 일을 그대로 물려받아 기능을 확장하는 개념 중 하나인데 ...



... 는 나중에 다뤄보도록 하죠. 이제 막 시작한(아마?) 여러분들에게는 조오금 벅찬 과정일 수 있습니다.

다른 언어에서 오신 분들도 있을까 싶어 말해두지만 그냥 Paper(Spigot(Bukkit)) API에서 메인 클래스로 인식할 수 있도록 JavaPlugin 클래스를 상속 시켜주는겁니다. 처음 시작하신 분들은 이 내용은 넘겨 들으셔도 됩니다.


어? 근데 빨간색이 뜨죠? 대체 뭐가 문제인가요? 분명 라이브러리도 추가했는데?


마우스를 한번 빨간색 위에 올려봅시다.

6f2ce912dcfd20fcc82b2aa0a4c9d8c9.png

Q. JavaPlugin 이라는 기호를 알아먹을 수 없다는 데, 지금 저한테 약파는 건가요?

A. ㅎㅎ; 사실 어떤 언어든(아마?) 외부 라이브러리를 프로젝트에 가져왔다고 해서 바로 써먹을 수 있는 건 아닙니다.

바로 import 라는 기능이 필요하지요.

import란? 

외부 라이브러리, 또는 자바 내장 라이브러리에서 외부 클래스를 이 코드에서 사용(참조)할 수 있도록 하는 명령.

... 이라고 하면 너무 딱딱한데, 요약하면 Paper API 내에 어딘가에 있는 JavaPlugin 이라는 클래스 내용을 우리가 이 코드에 쓰겠다고 Java에게 선언하는겁니다. 즉, 라이브러리에 아무리 jar 파일을 가져와도 import를 하지 않는다면 아무것도 할 수가 없습니다!

d64ddf58eef50c3ef6270f6501c5f674.png

아무튼, 일단 저 사진의 밑에 있는  Import class를 눌러봅시다.

1aec83534aa4fc41fc463a87216afec4.png

오, 뭐가 생겼네요? 우리 Intellectual한 IntelliJ는(사실 대부분의 IDE도 이정도는 합니다 ㅎㅎ) 대충 해당되는 클래스 이름을 입력하면 알아서 클래스가 위치한 패키지(여기서 나오네요!)를 찾아 자동으로 import 해줍니다.

보시면 알겠지만 대부분의 Paper(Spigot(Bukkit)) API의 클래스는 org.bukkit 패키지 내부에 위치하고 있습니다. 

이제 Main 클래스는 JavaPlugin의 속성을 지닙니다. 즉, 이제 플러그인의 메인 클래스로서 사용할 수 있다는 뜻입니다.


Q. 메인 클래스?

Bukkit은 서버를 열면 자동으로 서버 폴더\plugins\ 내에 있는 모든 .jar 파일들을 검사합니다. 그리고 후술할 plugin.yml 파일의 정보를 토대로 JavaPlugin을 상속한 클래스를 찾게 되는데, 이것이 메인 클래스입니다.

plugin.yml 설정은 조금 이따가 다루기로 하고, 일단은 서버가 켜질 때꺼질 때, 콘솔에 메세지가 가도록 해 봅시다!


서버가 켜질 때 메세지 띄우기

92d3579c8dec480219c5d9fa9c78a80d.png

두 중괄호 사이에 공간을 넉넉~ 하게 만들어 주신 후, 그 빈 공간에 onenable을 써 보면 저런 모습이 뜰 겁니다.

저 상태에서 엔터를 누르면...

 84409cccfb4efb834fdac74ca2feb647.png

와! 이런 모양새가 나왔네요!

IntelliJ의 기능 중 하나인데, 알아서 부모 클래스의 기능을 Override하는 메소드를 자동으로 작성해 주는 기능입니다.

뭐, 자세히 알 필요는 없고, 저 드래그 된 부분을 잠시 지워두고, 우리가 원하는 내용을 써 봅시다.

여기서부터 콘솔에 메세지를 띄우는 방법이 강좌마다 다르던데, 일단 Logger 클래스를 활용하는 방법으로 가 보겠습니다.

9dde8252b93e38faa8b0ea2062cc9b28.png

잠깐 onEnable 안의 중괄호를 나와, 다시 Main 안의 중괄호 공간에 Logger logger = getServer().getLogger(); 를 작성해봅시다.

93547354bde1dfa8d71aaa8d15bad038.png

오, Logger만 쳐도 뭐가 바로 나오네요. 엔터를 눌러 import 해 줍시다.

35a7e7e2bb58d578824596e564dc301f.png

짜잔, 쓰던 거 계속 써 줍시다.

f4bd000bfec5117402ad0882b11b3c43.png

이름까지 자동으로 제안해주는 갓-IntelliJ

859aa514d4cf84426eaf53988e12a00f.png

알아서 찾아주네요. 엔터!

3a0e25c6e8ebc6ee12e7412b8665f8a2.png52f73ddfeaefaf2363fae8afb678c3d8.png

이제 우리는 다른 플러그인에서 보던 것처럼 INFO, WARN, ERROR를 구분해서 콘솔에 메세지를 띄울 수 있습니다.

어떻게 하냐구요?

05a360face6028a5b1f5d9732a3086f7.png

바로 이렇게! logger.info("MSG 플러그인 활성화"); 를 작성 해 주세요. 이러면 매 번 서버가 켜질 때(정확히는 이 플러그인이 가져와질 때) MSJ 플러그인 활성화라는 메세지가 나올겁니다.


꺼질 때 메세지 띄우는것도 비슷합니다.

e97a1f2c80a9ab5cb1343a78ca71d666.png 

b8a6a87e473a614c1236d9419a2edfd9.png

 af495bbe883a6ee4711bee33ebee9f67.png

와! 이제 끌 때도 MSJ 플러그인 비활성화 라는 메세지가 나오겠네요!


plugin.yml 작성하기

음... 근데 대충 기능은 다 작성한 것 같은데, 생각해보니 과연 Paper가 이렇게만 해서 우리 플러그인을 인식할 수 있을 것 같나요?

아마도 그랬다면 Paper가 서버를 시작할 때 대규모 플러그인의 경우는 모든 클래스를 다 뒤지느라 부팅하는 데에만 10분이 걸렸을 것 같은데... 그건 아닌 것 같죠?

따라서 Paper가 우리의 플러그인을 인식할 수 있도록 플러그인의 기본적인 정보를 담는 plugin.yml 파일을 작성 해 봅시다!

a4d41c7654d9ebb48897c930e79aa707.png

일단 폴더를 하나 만들어 줍시다. 프로그램 소스 외에 여러가지 파일을 담을 공간의 목적입니다.

bc756bdb27c7aa5f9f551efecf0a116d.png

resources 라는 이름으로 만들어줍시다.

ad918c7bc508f76bb33d3fea228a1eed.png

파일을 하나 생성해 줄 겁니다.

6c807ae97d8abbcdf96b2bc0bfe2e29c.png

plugin.yml 이라는 이름으로 하나 파일을 만들어 줍시다. 엔터!

999d2eaafea189011e839c554526575a.png

펼쳐진 공허한 공간 ...

우리는 여기에 플러그인에 필요한 기본 정보들을 담을 것입니다.

그럼 대체 플러그인에 필요한 기본 정보가 뭐냐?

name: MSJ
version: 1.0
main: me.kobins.Main
api-version: 1.15

nameversion은 그냥 평범한 문자열로 각각 플러그인의 이름과 버전을 적어주시면 됩니다.

main은 위에서 말한 메인 클래스의 경로를 가져오시면 되는데 ...

594062a9346d0629fddbb13fcc7059f0.png

저기 있는 me.kobins 에다가 뒤에 점.이랑 클래스 이름 Main 붙이시면 me.kobins.Main 완성!

그리고 최근 버전 오면서 생긴 내용인 api-version: 1.15도 추가해줍시다. (안써주면 Paper가 싫어함)

eceb6cc7c7c6812548123509dcbc3c00.png

짜잔~ (노란 음영은 무시해도 됨. String 들어갈 공간에 숫자 썼다고 경고하는 중... 어차피 버전인데...)
그리고 Ctrl+S를 눌러 저장해줍시다!

(※인텔리제이에서는 이것도 자동완성을 해 줍니다. 앙 기모띠) 

그럼 진짜로 우리는 Paper 플러그인을 만들 준비가 다 되었습니다! 이제 jar 파일로 뽑으면 되는데...

IntelliJ에는 jar로 추출하기 위해 한 가지 과정이 필요합니다.


Artifact 설정하기

이 기능은 IntelliJ의 모듈을 원하는 형태로 Export할 수 있게 만든 기능입니다.

우리는 Jar 형태로 Export하여 우리 서버에 한번 넣어봐야지요?

fdd06f4f004d88ed044b299d7e0fd1e6.png

아까 들어갔던 모듈 설정을 들어가줍시다.

c9892ec4f8aea456208d26acd64e9b3d.png

순서대로 Artifacts -> + 버튼 -> JAR -> Empty를 눌러줍시다.

8c900c99b962a8a58b204a4c0f4619f9.png

unnamed라는 친구가 생겼을 텐데, 원하는 이름으로 일단 바꿔줍시다.

edbffbe2dbc0daf2f084db40b6e05c56.png

음... 좋아요.... 그리고 경로를 설정 해 줍시다. 우리는 플러그인을 수정하고 바로바로 그 결과를 보고싶으니 서버의 플러그인 폴더로 설정 해 줍시다!

389efbd2769598765b4f31d29d88535d.png

저 폴더 모양을 누르면 경로를 지정할 수 있습니다.

728c723414a0432b85568c990b87c044.png

아까 대충 페이퍼를 다운받은 폴더나, 아님 따로 구축해둔 서버가 있으면 그 서버 폴더의 plugins에 지정 해 줍시다.

만약에 아까 페이퍼를 다운받은 폴더에 하면 아마 서버를 제대로 열지 않고 와서 plugins 폴더가 없을테니, 위의 폴더 생성 버튼으로 plugins 폴더를 만들어 준 뒤에 OK를 눌러줍시다.

b2228855466d7dad78918ec31c8f24dc.png

그리고 사진의 화살표를 눌러 저 'MSJ' compile output을 더블클릭 해 봅시다.

b4868fd6eda010e3286ad3fb383b5ca0.png

짜잔! 이제 우리가 만들 jar 파일에 MSJ 모듈의 내용들이 들어가게 되었습니다.

그리고 우리가 아까 만든 plugin.yml도 jar 파일에 포함시켜 봅시다.

2da29761f809184fe6cf713bd9855344.png

왼쪽의 + 버튼을 눌러 Directory Content 선택

54d1b00255efa7e24bde9f05bc19f6cc.png

프로젝트 폴더에 들어가 아까 만들어둔 resources 폴더 선택

f976716ff835528ae11db1a1b03ef34d.pngd62fedd235d1df25c13a69268e1d8d77.png

이제 resources 폴더 안에 있는 모든 친구들은 전부 jar로 만들어질 때 같이 나갑니다.

그리고 그 resources 폴더 안에 plugin.yml 파일을 Paper가 찾아서 플러그인의 정보를 읽고

아까 적어둔 main: me.kobins.Main의 정보를 토대로 우리의 플러그인을 로드할겁니다!

89c239bbd63739a3121a8b78a8182f3d.png

OK!

6b0301ac1d715eb3399f8cef93123876.png

이제 우리가 설정한 jar를 진짜로 뽑아낼 시간입니다. Build -> Build Artifacts... 를 눌러주세요! (단축키는 제가 임의로 설정)

2a1b4096a5cdd46d85b83b02c9f07f70.png

Build!!!

a7dfbd248aadd20a0cc9fd9a81d663c7.png

13da8549e5c236c984629e0f1fd1cb14.png

좋아요!!!

2198ff5f00d67fd078ef7041a270d561.png

짜란 !!!!!!!

838c42ba4c363abdf7445d997bba1f8e.png

아까 서버를 열면서 생긴 eula.txt 파일의 내용을 true로 바꿔주고... (이거 안하면 서버 못염)

103aac18624d620b6ad3db15e903111c.png

가즈앗
04c373cb8a6440ed78274b6f506dc321.png

아주 긴 시간의 월드 생성 후...

0bc79c3fb6ebbe32a6049113ef6e4da1.png

아!!!!!!!!!!!!!!!!! 바로 이거야!!!!!!!!!!!!!!!!!!!!
bed8e77aee24af236737dbcd862fb45b.png

끄면?

4162d692b4824bfec2b0c67e39127c35.png

이예아!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


목차

 




30개의 댓글

juyeong
14 일 전

와 대단하네요

세리시아
14 일 전

자바의 j 자도 모르는 초보인데도 뭔가에 홀린 듯 따라하다 보니 신기하게 저게 되네요ㅋㅋ

재밌는 강의 감사합니다!

윈트초코
17 일 전

JDK 설치 페이지가 바뀐거 같은데.. 저만 그런가요?

접속이 되긴 되는데 다운로드 목록이 비어 있어요

Kobins
19 일 전
@나는낫닝겐이닷

9c4272801090764cb530f7e6681d3b91.png

이렇게 안뜨신다는것??

엠군
20 일 전

오라클의 jdk 대신 zulu 추천드립니다.

의외로 이슈도 없고 환경 설정까지 해줍니다.

여러번 따라해봤지만 계속되는 오류로 결국 질문을 드려야겠다 싶어서 말씀 드립니다. jdk8 버전 자바도 최신버전입니다만, 오류문 해석 결과 제 플러그인은 클래스 버전 57, 즉 최신버전의 자바 런타임으로 컴파일 되었지만, 이 버전의 자바 런타임은 클래스 버전 52까지만 지원한다고 하네요...

 

'plugins\Practice.jar' 폴더를 로드할 수 없음

org.bukkit.플러그인.InvalidPluginException: java.lang.지원되지 않는 ClassVersionError: 나/beebora/Main은 Java Runtime의 최신 버전(클래스 파일 버전 57.0)에 의해 컴파일되었으며, 이 버전의 Java Runtime은 최대 52.0까지의 클래스 파일 버전만 인식함

 

이런 문장입니다.

Kobins
20 일 전
@스피드웨건도와줘요

밑에 Redips님이 문의주신것하고 같은 내용입니다 ㅎㅎ; 강좌글 중간에 JDK 버전을 11에서 8로 바꾸는 부분이 있어요. (첫 프로젝트 만들기 부분)

@Kobins

앗 그러네요...ㅎㅎ 근데 그걸 적용하니까 또 다른 오류가 떠서요...ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ

 

[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
18 일 전
@스피드웨건도와줘요

자세히는 모르겠지만 Jar does not contain plugin.yml 라고 뜨는 것을 보면 plugin.yml 작성하기 문단부터 다시보면서 해보시면될것같습니다 (resources 폴더 만들기 -> resources 폴더 안에 plugin.yml 만들고 내용넣기 -> Artifact에서 resources 폴더도 등록하기)
+꿀팁인데 단순한 문제인 경우에는 로그에 오류를 바로 해결할 수 있는 내용이 적혀있는 경우가 많아서 구글번역기 한번 돌려보는것도 나쁘지않음

paper apl 다운로드 눌러서 사이트에 들어갔는데 아무것도 안 떠요

Kobins
20 일 전
@나는낫닝겐이닷

띠용? https://papermc.io/downloads 접속이 안되시나요??

리오채널
23 일 전

저도 적용시키면 에러가 뜨는데, 알려주실 수 있으신가요? jdk 8로 했습니다.

=============================================================

[15:27:40 ERROR]: Could not load 'plugins\MSJ.jar' in folder 'plugins'

org.bukkit.plugin.InvalidPluginException: Cannot find main class `me.leochannel.Main'

at org.bukkit.plugin.java.PluginClassLoader.(PluginClassLoader.java:70) ~[patched_1.15.2.jar:git-Paper-134]

at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:134) ~[patched_1.15.2.jar:git-Paper-134]

at org.bukkit.plugin.SimplePluginManager.loadPlugin(SimplePluginManager.java:352) ~[patched_1.15.2.jar:git-Paper-134]

at org.bukkit.plugin.SimplePluginManager.loadPlugins(SimplePluginManager.java:272) ~[patched_1.15.2.jar:git-Paper-134]

at org.bukkit.craftbukkit.v1_15_R1.CraftServer.loadPlugins(CraftServer.java:358) ~[patched_1.15.2.jar:git-Paper-134]

at net.minecraft.server.v1_15_R1.DedicatedServer.init(DedicatedServer.java:234) ~[patched_1.15.2.jar:git-Paper-134]

at net.minecraft.server.v1_15_R1.MinecraftServer.run(MinecraftServer.java:885) ~[patched_1.15.2.jar:git-Paper-134]

at java.lang.Thread.run(Unknown Source) [?:1.8.0_241]

Caused by: java.lang.ClassNotFoundException: me.leochannel.Main

at java.net.URLClassLoader.findClass(Unknown Source) ~[?:1.8.0_241]

at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:171) ~[patched_1.15.2.jar:git-Paper-134]

at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:100) ~[patched_1.15.2.jar:git-Paper-134]

at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_241]

at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_241]

at java.lang.Class.forName0(Native Method) ~[?:1.8.0_241]

at java.lang.Class.forName(Unknown Source) ~[?:1.8.0_241]

at org.bukkit.plugin.java.PluginClassLoader.(PluginClassLoader.java:68) ~[patched_1.15.2.jar:git-Paper-134]

... 7 more

Kobins
23 일 전
@리오채널

plugin.ymlmain: 부분을 적을 때 me.leochannel.Main으로 적었으면
플러그인 소스 코드 내부에도 me 패키지 안에 leochannel 패키지 안에 Main 클래스가 있어야 해요!

만약에 클래스 이름을 LeoPlugin 같이 지으셨다면 plugin.ymlmain: 에도 me.leochannel.LeoPlugin 같이 작성해주심 됩니다.

리오채널
23 일 전
@Kobins

여기에 나온 이름이라면 me.leochannel빼고 다 이름 같게 했습니다 ㅎㅎ;; 닉네임만 달라유

Main.java클래스 있고요, resources폴더?도 있고요, 심지어 MSJ까지 같게 했어요 ㅎ;; 모르시면 로드님꺼 따라할게요(블로그)

리오채널
23 일 전
@Kobins

혹시나 해서 Main을 LeoPlugin으로 바꿔봐도 안되네요 ㅎ; 혹시 아신다면 답변 부탁드립니다

Kobins
22 일 전
@리오채널

댓글 작성하실 때 밑에 에디터 눌러서 plugin.yml 어떻게 작성돼있는지랑 IntelliJ 왼쪽에 뜨는 프로젝트 트리 구조 다 펼쳐서 작성해주실 수 있으신가요? 명확하게 모르겠읍니다..

리오채널
22 일 전
@Kobins

822deb375be891746e8125cf3c2fbc63.png9a8969f7fb5c8f484bc325165712d6d8.pngd59b569699eb095f6953de82ec890cf3.png

이렇습니다

Kobins
21 일 전
@리오채널

위에 package 부분에서 .LeoPlugin 부분을 지워보세요

@Kobins

c0cdc4e691386a7e77fcb5a2dea7ccf9.png

이 글을 Main에도 똑같이 하라는 줄 알았네요 ㅋㅋㅋㅋ 이제 잘 작동됩니다! 정말 감사합니다 ㅠㅠ

Redips
27 일 전

저만 플러그인 적용하면 에러뜨나요?

Kobins
27 일 전
@Redips

어떤 에러가 뜨시는지요?

Redips
26 일 전
@Kobins

[16:28:42] [Server thread/WARN]: Plugin testplugin v1.0 does not specify an api-version.

[16:28:43] [Server thread/ERROR]: Could not load 'plugins\FirstPlugin.jar' in folder 'plugins'

org.bukkit.plugin.InvalidPluginException: java.lang.UnsupportedClassVersionError: main/Main has been compiled by a more recent version of the Java Runtime (class file version 57.0), this version of the Java Runtime only recognizes class file versions up to 52.0

at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:139) ~[spigot.jar:git-Spigot-9de398a-9c887d4]

at org.bukkit.plugin.SimplePluginManager.loadPlugin(SimplePluginManager.java:334) ~[spigot.jar:git-Spigot-9de398a-9c887d4]

at org.bukkit.plugin.SimplePluginManager.loadPlugins(SimplePluginManager.java:253) [spigot.jar:git-Spigot-9de398a-9c887d4]

at org.bukkit.craftbukkit.v1_14_R1.CraftServer.loadPlugins(CraftServer.java:350) [spigot.jar:git-Spigot-9de398a-9c887d4]

at net.minecraft.server.v1_14_R1.DedicatedServer.init(DedicatedServer.java:194) [spigot.jar:git-Spigot-9de398a-9c887d4]

at net.minecraft.server.v1_14_R1.MinecraftServer.run(MinecraftServer.java:776) [spigot.jar:git-Spigot-9de398a-9c887d4]

at java.lang.Thread.run(Unknown Source) [?:1.8.0_241]

Caused by: java.lang.UnsupportedClassVersionError: main/Main has been compiled by a more recent version of the Java Runtime (class file version 57.0), this version of the Java Runtime only recognizes class file versions up to 52.0

at java.lang.ClassLoader.defineClass1(Native Method) ~[?:1.8.0_241]

at java.lang.ClassLoader.defineClass(Unknown Source) ~[?:1.8.0_241]

at java.security.SecureClassLoader.defineClass(Unknown Source) ~[?:1.8.0_241]

at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:131) ~[spigot.jar:git-Spigot-9de398a-9c887d4]

at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:81) ~[spigot.jar:git-Spigot-9de398a-9c887d4]

at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_241]

at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_241]

at java.lang.Class.forName0(Native Method) ~[?:1.8.0_241]

at java.lang.Class.forName(Unknown Source) ~[?:1.8.0_241]

at org.bukkit.plugin.java.PluginClassLoader.(PluginClassLoader.java:59) ~[spigot.jar:git-Spigot-9de398a-9c887d4]

at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:135) ~[spigot.jar:git-Spigot-9de398a-9c887d4]

... 6 more

Kobins
26 일 전
@Redips

자바 버전 문제입니더 ㅎㅎ;

글 중간에 '첫 프로젝트 만들기' 부분에서 자바 버전을 11(기본)에서 8로 설정하는 부분이 있는데 그부분 해주시면됨

자바 8이 없으면 그 바로 윗부분에 JDK 8 까는게 있어요

Redips
26 일 전
@Kobins

이제 잘 작동 하네요! 이런 좋은글 써주셔서 감사합니다!!

wysohn
2020.02.27

제가찾던 플러그인 개발 강좌 여기있었네요

프리루트
2020.02.26

좀 나눠서 작성하시지 허허... 고생하셨습니다

Kobins
2020.02.26
@프리루트

한달전쯤에 쓰다가 현타와서 때려쳤다가 다시 써서 결국 완성했습니다 ㅎㅎ;

그러다보니 좀 길어진감이 있네요 ㅎㅎ;

프리루트
2020.02.26
@Kobins

질좋은 강좌글 감사합니다 bb

나눠서 쓰시면 작성하실 수 있는 글 양이랑 늘어날 수 있어서 권장드려보았어요 그게 Kobins 님께도 훨씬 좋으실거 같아서 허허

조회 수 제목 글쓴이
390 한디포 이용 규칙 15 초스터
626 한디포 이용 가이드! 처음 온 분은 읽어둡시다! 15 초스터
9124 한마포 AD 소개 (유료 광고 서비스) 57 U 프리루트
385 [플러그인] [마시자] 마인크래프트로 시작하는 Java 0강 - JDK 설치 / IntelliJ IDEA 설치 / Paper API 가져... 30 Kobins
421 [플러그인] [1강] 마인크래프트 플러그인 개발하기 - 활성화 비활성화 9 JSD-ITHAN
211 [프로그래밍 일반] [4강:Ping Pong!] 파이썬으로 디스코드봇 민들어보기 5 라고솔로가말했습니다
630 [플러그인] [2강]마인크래프트 플러그인 개발하기 - 긴 커맨드 12 JSD-ITHAN
47 [기타] [네모팁] 자주 사용하는 Git 명렁어 6 네모
34 [프로그래밍 일반] Python 강좌 3강 - 자료형이란 무엇일까? (1) sleepylapis
169 [플러그인] [마시자] 마인크래프트로 시작하는 Java 시리즈 2 Kobins
91 [프로그래밍 일반] Python 강좌 0강 - Python은 무엇일까요? 5 sleepylapis
126 [프로그래밍 일반] Python 강좌 2강 - 메세지 출력해보기 10 sleepylapis
67 [프로그래밍 일반] Python 강좌 1강 - Python을 설치해보아요! 3 sleepylapis
209 [스크립트] 명령어 막기 스크립트. 21 윈트초코
45 [데이터팩] 초큐의 데이터팩 초급 강좌! [1편 - 데이터팩 베이스 만들기] 윈트초코
96 [스크립트] `엔티티를 우클릭했을때` 이벤트 2 윈트초코
69 [플러그인] Spigradle - 더이상 plugin.yml 을 수동으로 만들지 마세요! EntryPoint
153 [플러그인] [5강]마인크래프트 플러그인 개발하기 - (ChatColor) 채팅 색깔 바꾸기 4 JSD-ITHAN

 

개발자 최신글
https://www.koreaminecraft.net/files/thumbnails/955/552/001/262x150.crop.jpg

구인

1.12.2 RPG서버 개발팀.건축팀 모집합니다/Esther.KR

Esther.KR

2020-04-10

0

사진이 없습니다.

구인

건축가, 스크립터를 구합니다! ※건축가를 더 빨리 구합니다!!!※

마크러버

2020-04-09

0