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 :
- La construction le uber-JAR exécutable
- L’exécution de la webapp via la ligne de commande gradle bootRun
- 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 :
- Better dependency management for Gradle (Andy Wilkinson)
- Spring Boot Gradle plugin (Manuel de référence de Spring Boot)
- Projet GitHub sdeleuze/pring-kotlin-functional (Sébastien Deleuze)
- Projet GitHub mixitconf/mixit (MiXiT website)