Gradle λ©ν° νλ‘μ νΈμμ 컨벀μ νλ¬κ·ΈμΈμΌλ‘ μμ‘΄μ± κ΄λ¦¬
Multi-project Structure
λΉ λ₯Έ μ΄ν΄λ₯Ό μν΄ μλμ²λΌ ꡬμ±ν΄ 보μμ΅λλ€.
μμ μμ€λ Githubμ μ¬λ €λμμ΅λλ€.
βββ gradle β βββ wrapper β β βββ gradle-wrapper.jar β β βββ gradle-wrapper.properties β βββ libs.versions.toml // 1. λ²μ μΉ΄νλ‘κ·Έ β βββ build-logic // 2. λΉλ νλ¬κ·ΈμΈμ μν νλ‘μ νΈ β βββ src β β βββ main β β βββ kotlin β β βββ io.github.ijmo.kotlin-application-conventions.gradle.kts β β βββ io.github.ijmo.kotlin-common-conventions.gradle.kts β β βββ io.github.ijmo.kotlin-library-conventions.gradle.kts β βββ build.gradle.kts β βββ settings.gradle.kts β βββ app // 3. μλΈ νλ‘μ νΈ β βββ build.gradle.kts βββ library // 3. μλΈ νλ‘μ νΈ β βββ build.gradle.kts β βββ gradlew βββ gradlew.bat βββ settings.gradle.kts // 4. λΉλ νλ¬κ·ΈμΈμ include
1. λ²μ μΉ΄νλ‘κ·Έ
βββ gradle β βββ wrapper β β βββ ... β βββ libs.versions.toml ...
λ²μ μ κ΄λ¦¬νκΈ° μν
libs.versions.toml
μ μΆκ°νμ΅λλ€.μμ‘΄ λΌμ΄λΈλ¬λ¦¬ λͺ©λ‘λ μ¬κΈ°μ κ΄λ¦¬λ₯Ό ν μ μμΌλ, μ λ λ²μ λ§ λ£μ΄λ³΄μμ΅λλ€.
[versions]
kotlin = "1.9.20"
springBoot = "3.2.0"
springCloud = "2023.0.0"
2. λΉλ νλ¬κ·ΈμΈμ μν νλ‘μ νΈ
βββ build-logic β βββ src β β βββ main β β βββ kotlin β β βββ io.github.ijmo.kotlin-application-conventions.gradle.kts β β βββ io.github.ijmo.kotlin-common-conventions.gradle.kts β β βββ io.github.ijmo.kotlin-library-conventions.gradle.kts β βββ build.gradle.kts β βββ settings.gradle.kts ...
libs.versions.toml
μ μ½μ΄μ€λλ‘ ν©λλ€. settings νμΌ κΈ°μ€μΌλ‘ μλκ²½λ‘λ₯Ό μ λ ₯νμ΅λλ€.
dependencyResolutionManagement {
versionCatalogs {
create("libs") {
from(files("../gradle/libs.versions.toml"))
}
}
}
rootProject.name = "my-example-app-build-logic"
λ§λ€λ €λ νλ¬κ·ΈμΈμμ μΈλΆ νλ¬κ·ΈμΈμ μ¬μ©νκ³ μΆλ€λ©΄ λΉλ μ€ν¬λ¦½νΈμμ μμ‘΄μ±μ μΆκ°ν΄μ£Όμ΄μΌ ν©λλ€. Spring Bootμ μ¬μ©νκΈ° μν΄
gradlePluginPortal
μ μλspring-boot-gradle-plugin
μ μΆκ°ν΄ μ£Όμμ΅λλ€.libs.versions.toml
μμ μ§μ ν λ²μ μ κ°μ Έμμ΅λλ€.
plugins {
`kotlin-dsl`
}
repositories {
gradlePluginPortal()
}
val versionCatalog = extensions.getByType<VersionCatalogsExtension>().named("libs")
dependencies {
implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:${versionCatalog.findVersion("kotlin").get()}")
implementation("org.springframework.boot:spring-boot-gradle-plugin:${versionCatalog.findVersion("springBoot").get()}")
}
gradle init
μ ν΅ν΄ νλ‘μ νΈλ₯Ό λ§λ€λ©΄ 3κ°μ§ λͺ¨λΈμ νλ¬κ·ΈμΈμ μ€μΊν΄λ© ν΄μ€λλ€. νμΌ μ΄λ¦μμλ μ μ μλ―μ΄ νλ‘μ νΈ κ³΅ν΅μΌλ‘ μ°μ΄λ 'common', μ±μμ μ°κΈ° μν 'application', λΌμ΄λΈλ¬λ¦¬μμ μ°κΈ° μν 'library' λ‘ λλμ΄μ§ ꡬ쑰μ λλ€.μλΈ νλ‘μ νΈμ μ νμ΄ ν μ’ λ₯(μ± λλ λΌμ΄λΈλ¬λ¦¬)μ΄κ±°λ λͺ¨λ νλ‘μ νΈκ° κ°μ μμ‘΄μ±μ κ°μ§λ€λ©΄ κ΅³μ΄ μ¬λ¬ νμΌλ‘ λλ νμμμ΄ ν νμΌμ λ€ μ§μ΄λ£μΌλ©΄ λκ² μ΅λλ€.
νμΌμ΄λ¦μ μ κΈ°μ€μΌλ‘ μ§μμΌλ μ μ νκ² λ°κΏμ μ°μλ©΄ λκ² μ΅λλ€.
plugins {
id("org.jetbrains.kotlin.jvm")
}
repositories {
mavenCentral()
}
dependencies {
constraints {
implementation("org.apache.commons:commons-text:1.10.0")
}
}
testing {
suites {
val test by getting(JvmTestSuite::class) {
useJUnitJupiter("5.9.3")
}
}
}
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(17))
}
}
λΉλ μ€ν¬λ¦½νΈμμ μμ‘΄μ±μ μΆκ°νμλ Spring Boot νλ¬κ·ΈμΈμ
plugins {}
μμμapply
ν΄μ£Όμμ΅λλ€.Spring BOM(Bill of Material)μ μ μ©νκΈ° μν΄
implementation(platform())
μ μ¬μ©νμ΅λλ€.μ¬κΈ°μ
dependencies {}
μ μΆκ°ν λΌμ΄λΈλ¬λ¦¬λresolve
λμ΄ classpathμ μΆκ°λ©λλ€. μλΈ νλ‘μ νΈμμ μ¬μ©νλ €λ©΄ ν΄λΉ νλ‘μ νΈμ λΉλ μ€ν¬λ¦½νΈμμdependencies {}
μ μΆκ°ν΄μΌ ν©λλ€.
plugins {
id("io.github.ijmo.kotlin-common-conventions")
id("org.springframework.boot")
application
}
val versionCatalog: VersionCatalog = extensions.getByType<VersionCatalogsExtension>().named("libs")
val springBootVersion = versionCatalog.findVersion("springBoot").get()
val springCloudVersion = versionCatalog.findVersion("springCloud").get()
dependencies {
implementation(platform("org.springframework.boot:spring-boot-dependencies:$springBootVersion"))
implementation(platform("org.springframework.cloud:spring-cloud-dependencies:$springCloudVersion"))
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
implementation("io.projectreactor.kotlin:reactor-kotlin-extensions:1.2.2")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor:1.7.3")
implementation("org.springframework.boot:spring-boot-starter-actuator")
implementation("org.springframework.boot:spring-boot-starter-webflux")
testImplementation("io.projectreactor:reactor-test:3.6.0")
}
λΌμ΄λΈλ¬λ¦¬ νλ‘μ νΈλ₯Ό μν νλ¬κ·ΈμΈ μ λλ€.
νμν λΌμ΄λΈλ¬λ¦¬λ₯Ό
dependencies {}
μ μΆκ°ν΄μ£ΌμΈμ.
plugins {
id("io.github.ijmo.kotlin-common-conventions")
`java-library`
}
3. λΉλ νλ¬κ·ΈμΈμ include
βββ settings.gradle.kts ...
λ§λ νλ¬κ·ΈμΈμ
pluginManagement {}
μ ν΅ν΄ ν¬ν¨μμΌ μ€λλ€.μλΈ νλ‘μ νΈλ
include()
ν΄μ€λλ€.
pluginManagement {
includeBuild("build-logic")
}
rootProject.name = "my-example-app"
include("app", "library")
4. μλΈ νλ‘μ νΈ
βββ app β βββ build.gradle.kts βββ library β βββ build.gradle.kts ...
classpathμ μΆκ°λ ν¨ν€μ§(λΌμ΄λΈλ¬λ¦¬) μ€μ κ° νλ‘μ νΈμ μ¬μ©ν ν¨ν€μ§λ₯Ό λΉλ μ€ν¬λ¦½νΈμ μΆκ°ν©λλ€.
plugins {
id("io.github.ijmo.kotlin-application-conventions")
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-actuator")
implementation("org.springframework.boot:spring-boot-starter-webflux")
testImplementation("io.projectreactor:reactor-test")
implementation(project(":library"))
}