TP2 - Gradle, votre ami pour le Java
Crédits : Florian Forestier
Gradle est un logiciel permettant de construire automatiquement des projets sur plusieurs langages, notamment Java, Groovy, ou C++. Grâce à un fichier de configuration, vous allez pouvoir indiquer à Gradle l'ensemble des dépendances de votre projet, les étapes de construction (la phase de build), et automatiser tout ce pan de la gestion de votre code. Désormais, Gradle s'occupe de maintenir vos dépendances et de les télécharger si besoin est, mais également de créer le binaire de votre application, de démarrer des tests automatiquement au build, et bien plus encore...
Premier usage
Pour commencer, clonez le projet de départ de ce TP sur votre VM (ça tombe bien, vous venez de découvrir Git !).
Dans ce projet, nous avons un ensemble de fichiers et de dossiers :
gradle/
: Ce dossier contient le wrapper de Gradle (c'est-à-dire, l'exécutable)src/
: Ce dossier contient nos sources Javagradlew
etgradlew.bat
: Ce sont les fichiers pour lancer Gradle, le premier sous Linux, le second sous Windows.build.gradle
: C'est le fichier qui nous permet de configurer notre Gradle !
Avant de regarder plus en détail ce dernier fichier, lançons notre
première commande Gradle : ./gradlew tasks
va vous permettre de lister
les tâches que Gradle va pouvoir accomplir pour vous sur ce projet.
Comme vous pouvez le constater avec le résultat de la commande, Gradle
sait effectuer de nombreuses actions très utiles au quotidien (builder
votre projet, lancer les tests, vérifier les dépendances, etc).
Regardons un peu plus en détail comment tout cela fonctionne, avec le
fichier build.gradle
.
Gradle sous la loupe
apply plugin: 'java'
apply plugin: 'application'
mainClassName='com.uca.StartServer'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.freemarker:freemarker:2.3.30'
implementation 'com.sparkjava:spark-core:2.9.3'
implementation 'com.h2database:h2:1.4.200'
compile 'io.jsonwebtoken:jjwt-api:0.11.2'
runtime 'io.jsonwebtoken:jjwt-impl:0.11.2', 'io.jsonwebtoken:jjwt-jackson:0.11.2'
compile 'org.mindrot:jbcrypt:0.4'
compile 'com.fasterxml.jackson.core:jackson-databind:2.11.1'
compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.11.1'
}
jar {
manifest {
attributes 'Implementation-Title': 'Gradle Quickstart',
'Implementation-Version': '1.0.0',
'Main-Class': 'com.uca.StartServer'
}
}
sourceSets.main.java.srcDirs = ['src']
sourceSets.test.java.srcDirs = ['src']
Revenons point par point sur ce fichier, et attardons-nous sur ce qu'il décrit.
apply plugin: 'java'
apply plugin: 'application'
Ici, nous indiquons à Gradle que nous allons utiliser des plugins. Les plugins sont des ensembles de règles et d'informations, pré-conçues par les développeurs de Gradle ou par des contributeurs, qui permettent d'éviter de réécrire les informations basiques à chaque fois. Ici, nous indiquons donc à Gradle que nous allons compiler du Java, et que nous construisons une application. Les plugins peuvent être facilement retrouvés dans le guide d'utilisateur de Gradle.
mainClassName='com.uca.StartServer'
[...]
sourceSets.main.java.srcDirs = ['src']
sourceSets.test.java.srcDirs = ['src']
Ces quelques lignes permettent d'indiquer à Gradle comment se comporter : où se trouvent les fichiers de source et de test, et quelle est la classe principale.
jar {
manifest {
attributes 'Implementation-Title': 'Gradle Quickstart',
'Implementation-Version': '1.0.0',
'Main-Class': 'com.uca.StartServer'
}
}
Cette partie du fichier va permettre à Gradle de générer automatiquement le manifeste de votre application Java. Pour rappel, le fichier de manifeste est un fichier standard, inclus dans chaque programme Java pour décrire ses fonctionnalités et ses propriétés.
repositories {
mavenCentral()
}
Nous indiquons ici à Gradle d'aller chercher toutes les dépendances sur MavenCentral, une plateforme de référence pour les dépendances et librairies Java.
dependencies {
implementation 'org.freemarker:freemarker:2.3.30'
implementation 'com.sparkjava:spark-core:2.9.3'
implementation 'com.h2database:h2:1.4.200'
compile 'io.jsonwebtoken:jjwt-api:0.11.2'
runtime 'io.jsonwebtoken:jjwt-impl:0.11.2', 'io.jsonwebtoken:jjwt-jackson:0.11.2'
compile 'org.mindrot:jbcrypt:0.4'
compile 'com.fasterxml.jackson.core:jackson-databind:2.11.1'
compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.11.1'
}
Enfin, nous indiquons ici l'ensemble des dépendances que nous utilisons, et à quel moment nous les utilisons.
Et si on buildait ?
Lancez la commande ./gradlew run
. Que se passe-t-il ?
Lancez la commande ./gradlew build
. Que se passe-t-il ?