[Gradle] ํ•˜์œ„ ํ”„๋กœ์ ํŠธ ๊ฐ„์˜ ์ข…์†์„ฑ ์„ ์–ธ(Declaring Dependencies between Subprojects)

2023. 2. 26. 19:23ยทTool/Gradle

Project dependencies

ํ•œ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปดํŒŒ์ผ ํด๋ž˜์Šค ๊ฒฝ๋กœ์—์„œ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—์„œ ์ƒ์„ฑ ํ•œ jar๋ฅผ ํ•„์š”๋กœํ•œ๋‹ค๋ฉด ์–ด๋–จ๊นŒ์š”? ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์˜ ์ „์ด ์ข…์†์„ฑ๋„ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ๋ถ„๋ช…ํžˆ ์ด๊ฒƒ์€ Java ๋‹ค์ค‘ ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ์˜ ๋งค์šฐ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์ข…์†์„ฑ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด Gradle์€ ์ด์— ๋Œ€ํ•œ ํ”„๋กœ์ ํŠธ ์ข…์†์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Example 1. Project dependencies

.
โ”œโ”€โ”€ buildSrc
โ”‚   ...
โ”œโ”€โ”€ api
โ”‚   โ”œโ”€โ”€ src
โ”‚   โ”‚   โ””โ”€โ”€...
โ”‚   โ””โ”€โ”€ build.gradle.kts
โ”œโ”€โ”€ services
โ”‚   โ””โ”€โ”€ person-service
โ”‚       โ”œโ”€โ”€ src
โ”‚       โ”‚   โ””โ”€โ”€...
โ”‚       โ””โ”€โ”€ build.gradle.kts
โ”œโ”€โ”€ shared
โ”‚   โ”œโ”€โ”€ src
โ”‚   โ”‚   โ””โ”€โ”€...
โ”‚   โ””โ”€โ”€ build.gradle.kts
โ””โ”€โ”€ settings.gradle.kts

์šฐ๋ฆฌ๋Š” ํ”„๋กœ์ ํŠธ, API ๋ฐ ๊ฐœ์ธ ์„œ๋น„์Šค๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์ธ ์„œ๋น„์Šค ํ”„๋กœ์ ํŠธ๋Š” ๋‹ค๋ฅธ ๋‘ ํ”„๋กœ์ ํŠธ์— ์ข…์†๋ฉ๋‹ˆ๋‹ค. api ํ”„๋กœ์ ํŠธ๋Š” ๊ณต์œ  ํ”„๋กœ์ ํŠธ์— ์ข…์†๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์—†์œผ๋ฉฐ ๋‹ค๋ฅธ ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ์— ์˜ํ•ด ์ฃผ์ž… ๋œ ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค. : ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ ๊ฒฝ๋กœ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ๊ฒฝ๋กœ ์ •์˜์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Settings.include(java.lang.String[])์˜ DSL ์„ค๋ช…์„œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

settings.gradle.kts

rootProject.name = "dependencies-java"
include("api", "shared", "services:person-service")

buildSrc/src/main/kotlin/myproject.java-conventions.gradle.kts

plugins {
    id("java")
}

group = "com.example"
version = "1.0"

repositories {
    mavenCentral()
}

dependencies {
    testImplementation("junit:junit:4.13")
}

api/build.gradle.kts

plugins {
    id("myproject.java-conventions")
}

dependencies {
    implementation(project(":shared"))
}

shared/build.gradle.kts

plugins {
    id("myproject.java-conventions")
}

services/person-service/build.gradle.kts

plugins {
    id("myproject.java-conventions")
}

dependencies {
    implementation(project(":shared"))
    implementation(project(":api"))
}

๊ณต์œ  ๋นŒ๋“œ ๋…ผ๋ฆฌ๋Š” ํ”„๋กœ์ ํŠธ ์ข…์†์„ฑ๋„ ์ •์˜ํ•˜๋Š” ํ•˜์œ„ ํ”„๋กœ์ ํŠธ์˜ ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ์— ์ ์šฉ๋˜๋Š” ๊ทœ์น™ ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ์ถ”์ถœ๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์ข…์†์„ฑ์€ ์‹คํ–‰ ์ข…์†์„ฑ์˜ ํŠน์ˆ˜ํ•œ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋จผ์ € ๋นŒ๋“œ๋˜๊ณ  ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์˜ ํด๋ž˜์Šค๊ฐ€์žˆ๋Š” jar๋ฅผ ํด๋ž˜์Šค ๊ฒฝ๋กœ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์˜ ์ข…์†์„ฑ์„ ํด๋ž˜์Šค ๊ฒฝ๋กœ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. gradle :api:compile์„ ํŠธ๋ฆฌ๊ฑฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ๊ณต์œ  ํ”„๋กœ์ ํŠธ๊ฐ€ ๋นŒ๋“œ๋œ ๋‹ค์Œ API ํ”„๋กœ์ ํŠธ๊ฐ€ ๋นŒ๋“œ๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์ข…์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ถ€๋ถ„์ ์ธ ๋‹ค์ค‘ ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Depending on artifacts produced by another project

ํ”„๋กœ์ ํŠธ ์ข…์†์„ฑ์€ ๋ชจ๋“ˆ ๊ฐ„์˜ ์ข…์†์„ฑ์„ ๋ชจ๋ธ๋งํ•ฉ๋‹ˆ๋‹ค. ํšจ๊ณผ์ ์œผ๋กœ, ๋‹น์‹ ์€ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์˜ ์ฃผ์š” ์ถœ๋ ฅ์— ์˜์กดํ•œ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ JAR ํŒŒ์ผ ์ธ Java ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ์—์„œ.

๋•Œ๋กœ๋Š” ๋‹ค๋ฅธ ์ž‘์—…์—์„œ ์ƒ์„ฑ๋œ ์ถœ๋ ฅ์— ์˜์กดํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐจ๋ก€๋กœ, ๋ฐ”๋กœ ๊ทธ ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์—…์ด ๋ฏธ๋ฆฌ ์‹คํ–‰๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋กœ ์ž‘์—… ์˜์กด ๊ด€๊ณ„๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์€ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๊ด€๊ณ„๋ฅผ ๋ชจ๋ธ๋งํ•˜๋Š” ์ข‹์ง€ ์•Š์€ ๋ฐฉ๋ฒ•์ด๋ฉฐ ๋ถˆํ•„์š”ํ•œ ๊ฒฐํ•ฉ์„ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ข…์†์„ฑ์„ ๋ชจ๋ธ๋งํ•˜๋Š” ๊ถŒ์žฅ ๋ฐฉ๋ฒ•์€ ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜, "๋‚˜๊ฐ€๋Š”" ์•„ํ‹ฐํŒฉํŠธ๋กœ ํ‘œ์‹œํ•˜๊ฑฐ๋‚˜, ์†Œ๋น„ ํ”„๋กœ์ ํŠธ์—์„œ ์˜์กดํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ ์†Œ์Šค ์ง‘ํ•ฉ์˜ ์ถœ๋ ฅ์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‘ ๊ฐœ์˜ ํ•˜์œ„ ํ”„๋กœ์ ํŠธ ์ƒ์‚ฐ์ž์™€ ์†Œ๋น„์ž์™€ ํ•จ๊ป˜ ๋‹ค์ค‘ ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ์—์„œ ์ž‘์—…ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ • ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•˜์œ„ ํ”„๋กœ์ ํŠธ ์ƒ์‚ฐ์ž๋Š” ๋นŒ๋“œ ์ •๋ณด(์˜ˆ: ํ”„๋กœ์ ํŠธ ๋ฒ„์ „)๊ฐ€ ํฌํ•จ๋œ ์†์„ฑ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” buildInfo๋ผ๋Š” ์ž‘์—…์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ž‘์—… ๊ณต๊ธ‰์ž๋ฅผ ์ถœ๋ ฅ ํŒŒ์ผ์— ๋งคํ•‘ํ•˜๋ฉด Gradle์ด ์ž๋™์œผ๋กœ ์ž‘์—… ์ข…์† ํ•ญ๋ชฉ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

Example 2. Task generating a property file containing build information

build.gradle.kts

plugins {
    id("java-library")
}

version = "1.0"

val buildInfo by tasks.registering(BuildInfo::class) {
    version.set(project.version.toString())
    outputFile.set(layout.buildDirectory.file("generated-resources/build-info.properties"))
}

sourceSets {
    main {
        output.dir(buildInfo.map { it.outputFile.asFile.get().parentFile })
    }
}

buildSrc/src/main/java/BuildInfo.java

public abstract class BuildInfo extends DefaultTask {

    @Input
    public abstract Property<String> getVersion();

    @OutputFile
    public abstract RegularFileProperty getOutputFile();

    @TaskAction
    public void create() throws IOException {
        Properties prop = new Properties();
        prop.setProperty("version", getVersion().get());
        try (OutputStream output = new FileOutputStream(getOutputFile().getAsFile().get())) {
            prop.store(output, null);
        }
    }
}

์†Œ๋น„ ํ”„๋กœ์ ํŠธ๋Š” ๋Ÿฐํƒ€์ž„์— ์†์„ฑ ํŒŒ์ผ์„ ์ฝ์„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ํ”„๋กœ์ ํŠธ ์ข…์†์„ฑ์„ ์„ ์–ธํ•˜๋ฉด ๋ฏธ๋ฆฌ ์†์„ฑ์„ ๋งŒ๋“ค๊ณ  ๋Ÿฐํƒ€์ž„ ํด๋ž˜์Šค ๊ฒฝ๋กœ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Example 3. Declaring a project dependency on the project producing the properties file

build.gradle.kts

dependencies {
    runtimeOnly(project(":producer"))
}

์œ„์˜ ์˜ˆ์—์„œ ์†Œ๋น„์ž๋Š” ์ด์ œ ์ƒ์‚ฐ์ž ํ”„๋กœ์ ํŠธ์˜ ์ถœ๋ ฅ์— ๋Œ€ํ•œ ์ข…์†์„ฑ์„ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋ณธ ์ถœ๋ ฅ ์•„ํ‹ฐํŒฉํŠธ์— ๋”ฐ๋ผ ํ•˜๋‚˜์˜ ์˜ˆ์ผ๋ฟ์ž…๋‹ˆ๋‹ค. Gradle์—๋Š” ํ”„๋กœ์ ํŠธ๊ฐ„์— ์ž„์˜์˜ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ๊ณต์œ ํ•˜๊ณ  Gradle์ด ํ•„์š”์— ๋”ฐ๋ผ ๋นŒ๋“œ ํ•  ์ˆ˜์žˆ๋Š” ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ์ข…์†์„ฑ ๊ด€๋ฆฌ ์—”์ง„ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ”„๋กœ์ ํŠธ ๊ฐ„ ์ถœ๋ ฅ ๊ณต์œ ์— ๋Œ€ํ•œ ์„น์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”.

 

 

728x90
'Tool/Gradle' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Gradle] 8.0.2 ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ(๋ณ€๊ฒฝ๋œ ์ )
  • [Gradle] ํ•˜์œ„ ํ”„๋กœ์ ํŠธ ๊ฐ„ ๋นŒ๋“œ ๋กœ์ง ๊ณต์œ  (Sharing Build Logic between Subprojects)
  • Gradle์„ ์‚ฌ์šฉํ•˜์—ฌ ์†Œํ”„ํŠธ์›จ์–ด ๊ตฌ์„ฑ์š”์†Œ ๊ตฌ์„ฑ ์š”์†Œ ๊ตฌ์„ฑ ๋ฐ ๋นŒ๋“œํ•˜๊ธฐ
  • [Gradle] ๋นŒ๋“œ ์ˆ˜๋ช… ์ฃผ๊ธฐ
์ง€๋‹ˆ๐Ÿงž‍โ™‚๏ธ๐Ÿฅญ
์ง€๋‹ˆ๐Ÿงž‍โ™‚๏ธ๐Ÿฅญ
์ผ์ƒ, ๊ฒŒ์ž„, ๋ง›์ง‘, ์—ฌํ–‰, ๊ฐœ๋ฐœ, IT ๋ธ”๋กœ๊ทธ๐Ÿงž
  • ์ง€๋‹ˆ๐Ÿงž‍โ™‚๏ธ๐Ÿฅญ
    ์š”์ˆ  ๋žจํ”„๐Ÿซ–
    ์ง€๋‹ˆ๐Ÿงž‍โ™‚๏ธ๐Ÿฅญ
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • All (549)
      • Languages (57)
        • JAVA (13)
        • JSP (1)
        • C_C++ (4)
        • Html (3)
        • CSS (1)
        • JavaScript (18)
        • Python (3)
        • Kotlin (13)
        • TypeScript (1)
      • Framework (14)
        • spring (11)
        • jstl (1)
        • angular (2)
      • Tool (28)
        • Eclipse (5)
        • vsCode (3)
        • scrcpy (2)
        • Git (1)
        • IntelliJ (6)
        • Visual-studio (1)
        • UML (1)
        • Gradle (8)
      • DB (6)
        • Oracle (1)
        • MySql (3)
        • Mongo (2)
      • OS (14)
        • Linux (2)
        • Windows (12)
      • Server (8)
        • Tomcat (1)
        • Apache (1)
        • Node.js (6)
      • Programmings (25)
        • Design Pattern (2)
        • Funny (20)
        • Algorithms (3)
      • Cloud (8)
        • Docker (1)
        • Kubernetes (4)
        • Istio (1)
        • ArgoCD (2)
      • IT (5)
        • gRPC (3)
        • RESTful (3)
        • Web UI (5)
        • AI (4)
      • Book (6)
      • TIP (187)
      • Life (53)
      • Game (83)
      • Storage (22)
      • ์‹๋‹น (15)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
    • ์‚ฌ์ดํŠธ๋งต
    • RSS
    • ๊ธฐํƒ€ ์†Œ๋“
  • ๋งํฌ

    • ๊ตฌ๊ธ€
    • ๋„ค์ด๋ฒ„
    • ์ •๋ถ€24
    • Spring Framework ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ
    • Kotlin ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ
    • ์นด์นด์˜ค ์• ๋“œํ•
    • ๋ธ”๋กœ๊ทธ ์‚ฌ์ดํŠธ๋งต
    • ๋ธ”๋กœ๊ทธ RSS
  • ๊ณต์ง€์‚ฌํ•ญ

    • ์•ˆ๋…•ํ•˜์„ธ์š”
  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ํƒœ๊ตญ
    ๋ธŒ๋ฆฌํ•‘
    ๋ฐ์ผ๋ฆฌ ๋‰ด์Šค
    ํ•œ๋ˆˆ์— ๋ณด๋Š” ์˜ค๋Š˜์˜ ๋‰ด์Šค
    ์˜ค๋Š˜์˜๋‰ด์Šค
    ํ€˜์ŠคํŠธ
    ๋‰ด์Šค ๋ธŒ๋ฆฌํ•‘
    ๋ชฌ์Šคํ„ฐํ—Œํ„ฐ์™€์ผ์ฆˆ
    ๋‰ด์Šค
    ๋ชฌ์Šคํ„ฐํ—Œํ„ฐ๋‚˜์šฐ
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
์ง€๋‹ˆ๐Ÿงž‍โ™‚๏ธ๐Ÿฅญ
[Gradle] ํ•˜์œ„ ํ”„๋กœ์ ํŠธ ๊ฐ„์˜ ์ข…์†์„ฑ ์„ ์–ธ(Declaring Dependencies between Subprojects)
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”