스프링부트 2.2.2 + 자바11 + mariadb 설정

plugins 에 들어가는 버전 관리

https://docs.gradle.org/current/userguide/plugins.html#sec:plugin_version_managemen

링크의 pluginManagement 부분을 활용해서 반복되는 코틀린 버전 부분을 별도 gradle.properties 로 관리합니다.

build.gradle.kts

plugins 부분에서 apply false 가 들어가는 이유는 plugins 에 선언하는 경우 바로 적용이 되어버리기 때문에 일단 보류하고 적절한 sub 프로젝트에 apply 를 통해서 적용하기 위함입니다.

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    id("org.springframework.boot") version "2.2.2.RELEASE" apply false
    id("io.spring.dependency-management") version "1.0.8.RELEASE" apply false

    // kotlin 관련 버전은 settings.gradle.kts 와 gradle.properties 에 선언
    kotlin("plugin.spring") apply false // The plugin specifies the following annotations: @Component, @Async, @Transactional, @Cacheable and @SpringBootTest.
    kotlin("plugin.jpa") apply false // The plugin specifies @Entity, @Embeddable and @MappedSuperclass no-arg annotations automatically.
    kotlin("jvm")
    kotlin("kapt")
}

val queryDsl = "4.2.1"
val mariadb = "2.5.2"

repositories {
    mavenCentral()
    maven { url = uri("https://repo.spring.io/milestone") }
    maven { url = uri("https://plugins.gradle.org/m2/") }
}

subprojects {
    repositories {
        mavenCentral()
        maven { url = uri("https://repo.spring.io/milestone") }
        maven { url = uri("https://plugins.gradle.org/m2/") }
    }

    apply(plugin = "java")
    apply(plugin = "kotlin")
    apply(plugin = "io.spring.dependency-management")
    apply(plugin = "kotlin-jpa")
    apply(plugin = "kotlin-kapt")

    group = "me.saru"
    version = "0.0.1-SNAPSHOT"
    java.sourceCompatibility = JavaVersion.VERSION_11

    the<io.spring.gradle.dependencymanagement.dsl.DependencyManagementExtension>().apply {
        imports {
            mavenBom(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES)
        }
    }

    dependencies {
        implementation("org.springframework.boot:spring-boot-starter-actuator")
        implementation("org.springframework.boot:spring-boot-starter-data-jpa")
        implementation("org.springframework.boot:spring-boot-starter-security")
        implementation("org.springframework.boot:spring-boot-starter-web")
        implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
        implementation("org.jetbrains.kotlin:kotlin-reflect")
        implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
        runtimeOnly("org.springframework.boot:spring-boot-devtools")
        testImplementation("org.springframework.boot:spring-boot-starter-test") {
            exclude(group = "org.junit.vintage", module = "junit-vintage-engine")
        }
        testImplementation("org.springframework.security:spring-security-test")

        implementation("org.mariadb.jdbc:mariadb-java-client:$mariadb")
        implementation("com.querydsl:querydsl-jpa:$queryDsl")
        
        kapt("org.springframework.boot:spring-boot-configuration-processor")
    }

    tasks.withType<Test> {
        useJUnitPlatform()
    }

    tasks.withType<KotlinCompile> {
        kotlinOptions {
            freeCompilerArgs = listOf("-Xjsr305=strict", "-Xallow-result-return-type")
            jvmTarget = "11"
        }
    }

    sourceSets {
    	kotlin.sourceSets.register("$buildDir/generated/source/kapt/main")
    }
}

project(":common") {
    dependencies {
        kapt("com.querydsl:querydsl-apt:${queryDsl}:jpa")
    }
}

project(":api") {
    apply(plugin = "kotlin-spring")
    apply(plugin = "org.springframework.boot")

    dependencies {
        implementation(project(":common"))

        implementation("org.springframework.boot:spring-boot-starter-thymeleaf")
        implementation("nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect:2.4.1")
        implementation("org.thymeleaf.extras:thymeleaf-extras-springsecurity5")
    }
}

gradle.properties

kotlinPluginVersion=1.3.61

이렇게 하지 않을 경우 gradle.build.kts 의 plugins 부분에 버전을 각각 적어줘야 합니다.

settings.gradle.kts

pluginManagement {
    val kotlinPluginVersion: String by settings
    plugins {
        kotlin("jvm") version kotlinPluginVersion
        kotlin("plugin.allopen") version kotlinPluginVersion
        kotlin("plugin.noarg") version kotlinPluginVersion
        kotlin("kapt") version kotlinPluginVersion

        kotlin("plugin.jpa") version kotlinPluginVersion
        kotlin("plugin.spring") version kotlinPluginVersion
    }
}

rootProject.name = "saru-service"
include("api", "common")

ps1. 커맨드라인에서 특정 모듈만 빌드하는 경우./gradlew :api:clean :api:build 와 같이 진행한다.

ps2. gradle wrapper 생성은 gradle wrapper --gradle-version 6.1

참고