개인 자료란 (JE)

  서버 커뮤니티

Profile SN1 대표칭호 없음
Profile

질문하기 플러그인

Gradle Subproject를 어떻게 구성해야 할까요?

2022.09.30 조회 수 137 추천 수 0
게임버전 (JE) 관련없음 
게임버전 (BE) 관련없음 

이전에 작성했던 글에서 이어지는 내용입니다. 큰 관련성은 없지만요.


여러 조언을 받아 최종적으로 Gradle Subproject를 이용한 NMS 지원을 시도하기로 했습니다.

그런데 Gradle의 Build 결과가 제가 원하는 것과는 상당히 다른 모양새로 나옵니다.

현재 디렉토리의 구조입니다.

my-lib
│  .editorconfig
│  .gitignore
│  build.gradle.kts
│  gradlew
│  gradlew.bat
│  settings.gradle.kts
│  
├─bukkit_1_19_R1
│  │  build.gradle.kts
│  │  
│  └─src
│      └─main
│          └─java
│              └─xyz
│                  └─mylib
│                      └─redacted
│                          └─internal
│                                  IMPlayer_v1_19_R1.java
│                                  
├─core
│  │  build.gradle.kts
│  │  
│  └─src
│      └─main
│          └─java
│              └─xyz
│                  └─mylib
│                      └─redacted
│                          │  MPlayer.java
│                          │  
│                          └─internal
│                                  IMPlayer.java
│                                  
└─gradle
   └─wrapper
           gradle-wrapper.jar
           gradle-wrapper.properties

core 모듈은 실제 bukkit_* 모듈이 구현해야 하는 클래스의 interface를 제공하며, 그 이외에 NMS가 필요하지 않은 Paper API에 대한 편의성 메소드 및 클래스를 제공하는 것이 목적입니다.

bukkit_* 모듈은 실제로 NMS가 필요한 부분에 대해서 Bukkit API 버전별로 실제 구현을 맡고 있고요.


문제는 여기서 root 프로젝트에 대해 build나 jar 작업을 실행하면 core 모듈과 bukkit_* 모듈 각각의 build 디렉토리에 jar 결과물이 나온다는 것입니다.


제가 원하는 결과물은 my-lib/build 디렉토리에 core 모듈과 bukkit_* 모듈의 모든 클래스가 합쳐진 형태의 jar이 만들어지는 것입니다.


이걸 어떻게 해야 할 수 있을까요?


현재 각 빌드 스크립트는 아래와 같습니다.

// build.gradle.kt
allprojects {
  apply {
    plugin("java")
  }

  repositories {
    mavenCentral()
    maven("https://repo.papermc.io/repository/maven-public/")
  }

  group = "xyz.mylib"
  version = "1.0.0-SNAPSHOT"
}
// bukkit_1_19_R1/build.gradle.kt
plugins {
  id("io.papermc.paperweight.userdev") version "1.3.8"
}

dependencies {
  compileOnly(project(":core"))
  paperDevBundle("1.19.2-R0.1-SNAPSHOT")
}
// core/build.gradle.kt
dependencies {
  compileOnly("io.papermc.paper:paper-api:1.19.2-R0.1-SNAPSHOT")
}
tasks.jar {
  // TODO: When run jar task in root project, include all subproject to its output
}


7개의 댓글

작은거인
2022.09.30

구글링..은 해보셨죠...?

저도 이걸로 검색해본적 있는데 바로 나오던디..

SN1
2022.09.30
@작은거인

키워드를 뭐로 하셨나요? gradle subproject combined나 gradle subproject merged, gradle subproject single output 등 여러 키워드로 검색해보아도 나오지 않던데요.

작은거인
2022.09.30
@SN1

아 합쳐야 되군요.

저는 그냥 build 폴더에 jar을 모아놓기만 해서..

찾아보겠습니닷 :)

작은거인
2022.09.30
@SN1

...근데 그냥 쉐도우 하면 되지 않나요...?

https://imperceptiblethoughts.com/shadow/

plugins {
  id 'com.github.johnrengelman.shadow' version '7.1.2'
  id 'java'
}
SN1
2022.09.30
@작은거인

쉐도우가 있었네요... 왜 이걸 생각 못했을까요.

그런데 쉐도우를 쓰게 되더라도 이게 root 디렉토리 아래의 build 디렉토리에 결과물을 넣을 것 같지는 않아 보입니다. 이건 조금 더 찾아봐야겠네요.

결과물을 root 바로 밑의 build 폴더에 넣는 것도 목표 중 하나인터라...

 

쉐도우 상기시켜주셔서 정말 감사드립니다!

작은거인
2022.09.30
@SN1

그건 jar 디렉토리 바꾸면 돼요

그리고 한 서브프로젝트에서 다 implementation으로 추가해서 쉐도우 하시고 jar 디렉토리를 루트의 한 폴더로 설정하시면 될 것 같네여

Dilemma
2022.10.04

제가 개인적으로 애용하고 있는 구조는 monun님의 paper-sample-complex 구조를 애용하고있습니다.

Paperweight를 이용해 Mojang 매핑된 코드를 작성 가능해서 이름 읽을때 엄청 편하더라고요.

무조건 NMS를 쓰신다하시면 논외일수도 있겠다만 한번 참고 해보시면 좋지 않을까 해서 알려드립니다.

 

https://github.com/monun/paper-sample-complex/

뉴스 및 창작물
/files/thumbnails/762/770/003/262x150.crop.jpg?20240418073724

레드스톤

T.B.H (고민중독) | 노트블럭 버전 | NoteBlock Cover [한국어 영어 중국어 가사 추가]

노트블럭전문가

2024-04-18

0

/files/thumbnails/218/767/003/262x150.crop.jpg?20240412130213

레드스톤

우리의 꿈 - 원피스 오프닝

노트블럭전문가

2024-04-12

0

/files/thumbnails/505/766/003/262x150.crop.jpg?20240411122306

레드스톤

기동전사 건담 수성의 마녀 | 노트블럭 커버 1

노트블럭전문가

2024-04-11

1

/files/thumbnails/932/765/003/262x150.crop.jpg?20240410124459

레드스톤

마인크래프트 노트블록으로 만든 『 밤양갱 (Bam Yang Gang) 』

노트블럭전문가

2024-04-10

0

/files/thumbnails/403/765/003/262x150.crop.jpg?20240409190538

레드스톤

마인크래프트 노트블록으로 만든 『 밤양갱 (Bam Yang Gang) 』

Sonttukk

2024-04-09

4