개인 자료란 (JE)

  서버 커뮤니티

Profile SN1 대표칭호 없음
Profile

질문하기 플러그인

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

2022.09.30 조회 수 186 추천 수 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
}


6개의 댓글

작은거인
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 디렉토리를 루트의 한 폴더로 설정하시면 될 것 같네여

뉴스 및 창작물
/files/thumbnails/761/908/003/262x150.crop.jpg?20241025153749

건축

서울 숭례문(崇禮門) 4

KHC

2024-10-25

2

/files/thumbnails/578/899/003/262x150.crop.jpg?20241010142350

건축

경주 월정교 1

KHC

2024-10-10

2

/files/thumbnails/219/899/003/262x150.crop.jpg?20241009200950

건축

송전탑+도시 2

dbasd12

2024-10-09

2

/files/thumbnails/246/898/003/262x150.crop.jpg?20241008102328

레드스톤

단다단 - 오토노케(オトノケ) | 마인크래프트 노트블럭 커버

노트블럭전문가

2024-10-08

1

/files/thumbnails/348/896/003/262x150.crop.jpg?20241006103035

디도스/봇테러등등을 낚는 방법 4

물귀신

2024-10-06

3