개인 자료란 (JE)

  서버 커뮤니티

Profile SN1 대표칭호 없음
Profile

질문하기 플러그인

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

2022.09.30 조회 수 107 추천 수 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 디렉토리를 루트의 한 폴더로 설정하시면 될 것 같네여

xnoeyhx
2022.10.04

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

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

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

 

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

뉴스 및 창작물
/files/thumbnails/728/352/003/262x150.crop.jpg?20221127060715

소식

현재 엔비디아 최신 드라이버에서 마인크래프트 구버전 플레이가 불가능합니다 3

코코냐

2022-11-27

4

/files/thumbnails/669/351/003/262x150.crop.jpg?20221125204354

업데이트

마인크래프트 프리뷰 및 베타 1.19.60.20 업데이트

Dalsu

2022-11-25

0

/files/thumbnails/663/351/003/262x150.crop.jpg?20221125194043

소식

마인크래프트 2022 블록 프라이데이 세일 시작

Dalsu

2022-11-25

0

/files/thumbnails/089/351/003/262x150.crop.jpg?20221124184623

업데이트

마인크래프트 1.19.3 프리릴리스 2 업데이트

마리오군

2022-11-24

1

/files/thumbnails/962/350/003/262x150.crop.jpg?20221124184619

업데이트

마인크래프트 1.19.3 프리릴리스 1 업데이트

마리오군

2022-11-24

1