Build Gradle en Kotlin d’une webapp Spring Boot

En guise de conclusion de mon précédent billet, je proposais de migrer le build Maven d’une application web Spring Boot 2 en un build Gradle basé sur le langage Kotlin. C’est désormais chose faite. Mais bien que Gradle privilégie aujourd’hui l’usage du DSL Kotlin au détriment de Groovy, son guide d’utilisation n’a pas encore été actualisé et il est difficile de trouver de la documentation. Il faut passer par le projet GitHub kotlin-dsl pour accéder à quelques tutoriaux et des exemples. Heureusement, GitHub fourmille d’autres d’exemples, notamment du côté des projets soutenus par les contributeurs Pivotal sur Spring Boot.

Sans plus tarder, voici le fichier de conf build.gradle.kts de la version Kotlin de Spring Petclinic.

Le fichier build.gradle.kts

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

buildscript {

    extra["kotlinVersion"] = "1.1.60"
    extra["springBootVersion"] = "2.0.0.M6"
    extra["jUnitVersion"] = "5.0.0"
    extra["boostrapVersion"] = "3.3.6"
    extra["jQueryVersion"] = "2.2.4"
    extra["jQueryUIVersion"] = "1.11.4"

    val springBootVersion: String by extra

    repositories {
        mavenCentral()
        maven("https://repo.spring.io/milestone")
    }

    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:$springBootVersion")
        classpath("org.junit.platform:junit-platform-gradle-plugin:1.0.2")
    }
}

plugins {
    val kotlinVersion = "1.1.60"

    id("org.jetbrains.kotlin.jvm") version kotlinVersion
    id("org.jetbrains.kotlin.plugin.spring") version kotlinVersion
    id("io.spring.dependency-management") version "1.0.3.RELEASE"
}

apply {
    plugin("org.springframework.boot")
}

val kotlinVersion: String by extra
val springBootVersion: String by extra
val jUnitVersion: String by extra
val boostrapVersion: String by extra
val jQueryVersion: String by extra
val jQueryUIVersion: String by extra

version = springBootVersion

tasks {
    withType<KotlinCompile> {
        kotlinOptions {
            jvmTarget = "1.8"
            freeCompilerArgs = listOf("-Xjsr305=strict")
        }
    }
}

repositories {
    mavenCentral()
    maven("https://repo.spring.io/milestone")
}

dependencies {
    compile("org.springframework.boot:spring-boot-starter-actuator")
    compile("org.springframework.boot:spring-boot-starter-cache")
    compile("org.springframework.boot:spring-boot-starter-data-jpa")
    compile("org.springframework.boot:spring-boot-starter-web")
    compile("org.springframework.boot:spring-boot-starter-thymeleaf")
    compile("javax.cache:cache-api")
    compile("org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion")
    compile("org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion")
    compile("org.webjars:webjars-locator")
    compile("org.webjars:jquery:$jQueryVersion")
    compile("org.webjars:jquery-ui:$jQueryUIVersion")
    compile("org.webjars:bootstrap:$boostrapVersion")

    testCompile("org.springframework.boot:spring-boot-starter-test")
    testCompile("org.junit.jupiter:junit-jupiter-api:$jUnitVersion")
    testRuntime("org.junit.jupiter:junit-jupiter-engine:$jUnitVersion")

    runtime("org.hsqldb:hsqldb")
    runtime("mysql:mysql-connector-java")
}

Quelques explications

Le DSL Kotlin pour Gradle a facilité la déclaration des plugins en introduisant le bloc plugins {}. Par exemple, le plugin de compilation du code source Kotlin de l’application est déclaré dans ce bloc.
Suite à un bug JUnit 5, le plugin junit-platform-gradle-plugin a dû rester déclaré dans le bloc buildscript {}. Un contournement existe, mais il ne fonctionne pas correctement lorsque les plugins sont tirés de plusieurs repos Maven, ce qui est le cas du plugin spring-boot-gradle-plugin en version Milestone 2.0.0.M6 qui n’est pas encore publié dans Maven Central.

Le plugin Spring Boot pour Gradle org.springframework.boot joue un triple rôle :

  1. La construction le uber-JAR exécutable
  2. L’exécution de la webapp via la ligne de commande gradle bootRun
  3. La gestion des dépendances

Attardons-nous un moment sur la gestion des dépendances. Fonctionnant de concert avec le plugin Dependency Management io.spring.dependency-management, le plugin Spring Boot permet d’éviter de déclarer la version des dépendances déclarées dans le bloc dependencies {} ; du moins, celles déclarées dans le BOM Maven spring-boot-starter-parent qu’il importe.

La centralisation des versions non déclarées dans le BOM passe par l’usage de la propriété extra déclarée sous forme d’extension Kotlin. Il est toutefois regrettable qu’extra ne soit pas visible du bloc plugins {}.

Conclusion

Par rapport au pom.xml d’origine, le build Gradle n’intègre pas encore la génération du CSS à partir de LESS (issue #4).
Novice en Kotlin et en Gradle, toute suggestion d’amélioration du build.gradle.kts est la bienvenue.
J’attends vos pull requests 🙂

Références :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.