Choisir le bon outil de construction : Ant vs Maven vs Gradle
Pendant le développement du logiciel, les développeurs doivent reconstruire le même code encore et encore. Ils essaient souvent d'utiliser des scripts bash ou d'autres langages de script pour automatiser la tâche. Cependant, il existe des outils de construction disponibles qui sont plus appropriés pour l'automatisation de la construction. Les outils de construction prédominants sont :
- Apache Ant avec Ivy
- Maven
- Gradle
Explorons les outils pour en savoir plus.
Apache Ant avec Ivy
Apache Ant est un outil de ligne de commande basé sur Java qui utilise des fichiers XML pour définir des scripts de construction. Il est principalement utilisé pour les versions Java, mais il peut également être utilisé pour le développement C/C++. Les tâches intégrées offrent des moyens de compiler, assembler, tester et exécuter des applications logicielles. Les utilisateurs peuvent également créer leurs propres « antlibs » pour améliorer les fonctionnalités de Ant. Apache Ivy est un outil de gestion des dépendances qui s'intègre facilement à Ant pour fournir un écosystème plus robuste. Le développement de Ant a commencé en 2000.
Avantages
- Un meilleur contrôle sur le processus de construction global
- Assez flexible pour fonctionner avec n'importe quel processus de travail
Les inconvénients
- Les fichiers de construction basés sur XML peuvent devenir volumineux et impossibles à maintenir
- Beaucoup de temps et de ressources sont nécessaires pour maintenir les scripts de construction
- L'intégration IDE est difficile à réaliser
Exemple de fourmi avec lierre
Vous pouvez installer la dernière Ant à partir d'ici. Vous devez télécharger le zip, développer et mettre le dossier bin dans votre chemin. Vous pouvez utiliser la commande suivante pour voir si Ant est correctement installé :
$ ant -versionApache Ant(TM) version 1.dix.1 compilé le 2 février 2017
Une fois Ant installé, vous pouvez télécharger le dernier pot Ivy et le mettre dans le dossier lib à l'intérieur du répertoire Ant.
Après avoir installé Ant, créez les dossiers helloworld et helloworld/src. Dans le dossier src, mettez helloworld.java avec le code :
/******************************Imprime "Hello World!"
***************************/
classe publique helloworld
public static void main(String[] args)
Système.en dehors.println("Bonjour tout le monde!");
Maintenant, dans le dossier helloworld, créez un build.xml avec le code suivant :
Et dans le même dossier helloworld, créez le lierre.xml avec le code suivant :
La structure du répertoire devrait ressembler à ceci :
Bonjour le monde|-- construire.xml
|-- lierre.xml
'-- src
'-- Bonjour le monde.Java
Vous pouvez maintenant exécuter la compilation avec la commande :
$ fourmiUne compilation réussie devrait fournir une sortie comme celle-ci :
$ fourmiFichier de construction : /Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build.xml
résoudre:
[ivy:retrieve] :: Apache Ivy 2.4.0 - 20141213170938 :: http://ant.apache.org/ivy/ ::
[ivy:retrieve] :: chargement des paramètres :: url = jar:file:/Users/zak/BuildTools/ANT/apache
-fourmi-1.dix.1/lib/lierre-2.4.0.pot!/org/apache/ivy/core/settings/ivysettings.xml
[ivy:retrieve] :: résolution des dépendances :: org.apache#helloworld;[email protected]
Macbook Air.local
[ivy:retrieve] confs : [default]
[ivy:retrieve] found junit#junit;4.12 en public
[ivy:retrieve] organisation trouvée.hamcrest#hamcrest-core;1.3 en public
[ivy:retrieve] :: rapport de résolution :: résoudre 397 ms :: artefacts dl 15 ms
---------------------------------------------------------------------
| | modules || artefacts |
| conf | nombre| rechercher|détruit|expulsé|| nombre|déchargé|
---------------------------------------------------------------------
| par défaut | 2 | 0 | 0 | 0 || 4 | 0 |
---------------------------------------------------------------------
[ivy:retrieve] :: récupération :: org.apache#helloworld
[ivy:retrieve] confs : [default]
[ivy:retrieve] 0 artefacts copiés, 4 déjà récupérés (0 ko/39 ms)
compiler:
[mkdir] Répertoire créé : /Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build/
Des classes
[javac] /Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build.xml:22 : avertissement :
'includeantruntime' n'a pas été défini, par défaut la compilation.sysclasspath=last ; mis à faux
pour des constructions reproductibles
[javac] Compilation d'un fichier source dans /Users/zak/_work/LearnBuildScripts/LearnANT/
helloworld/build/classes
pot:
[mkdir] Répertoire créé : /Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build/bin
[jar] Création d'un jar : /Users/zak/_work/LearnBuildScripts/LearnANT/helloworld/build/bin/
Bonjour le monde.pot
BÂTIR AVEC SUCCÈS
Temps total : 6 secondes
Vous pouvez essayer le fichier jar comme ceci :
$ java -cp build/bin/helloworld.pot helloworldBonjour le monde!
Nous avons défini le fichier jar à mettre dans le dossier build/bin. Les dossiers sont créés pendant la construction. La commande ant jar appelle la cible jar dans le build.xml.
Maven
Maven a été développé pour résoudre les problèmes rencontrés avec les scripts basés sur Ant. Il a conservé les fichiers XML mais a adopté une approche différente de l'organisation. Dans Ant, les développeurs doivent créer toutes les tâches. Maven réduit la création de tâches en mettant en œuvre des normes plus strictes pour l'organisation du code. En conséquence, il est plus facile de se lancer sur des projets standards.
Il a également introduit des téléchargements de dépendances qui ont facilité le développement. Avant l'introduction d'Ivy dans Ant, les utilisateurs devaient gérer les dépendances localement. Maven a d'abord adopté la philosophie de gestion des dépendances.
Cependant, les normes strictes de Mavens rendent difficile l'écriture de scripts de construction personnalisés. L'outil est facile à utiliser tant que le projet respecte les normes strictes.
Avantages
- Téléchargements automatiques des dépendances
- Toutes les dépendances sont automatiquement enregistrées dans le contrôle de source dans le cadre des scripts Maven
- Standardise et simplifie le processus de construction
- S'intègre facilement aux IDE et aux systèmes CI/CD
Les inconvénients
- Pas flexible dans la création de workflows personnalisés
- Courbe d'apprentissage abrupte et le processus est difficile à comprendre pour les novices
- Beaucoup de temps pour résoudre les problèmes de construction et les intégrations de nouvelles bibliothèques
- Pas bon avec plusieurs versions de la même dépendance
Exemple Maven
Vous pouvez télécharger le dernier Maven ici. Vous pouvez vérifier l'installation comme ceci :
$ mvn --versionApache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T00:58:13-07:00)
Accueil Maven : /Users/zak/BuildTools/Maven/apache-maven-3.5.2
Version Java : 1.8.0_74, fournisseur : Oracle Corporation
Accueil Java : /Bibliothèque/Java/JavaVirtualMachines/jdk1.8.0_74.jdk/Contenu/Accueil/jre
Paramètres régionaux par défaut : en_US, encodage de la plate-forme : UTF-8
Nom du système d'exploitation : "mac os x", version : "10.11.6", arc : "x86_64", famille : "mac"
Créez un dossier helloworld et générez un projet avec la commande suivante :
$ mvn archétype:générer -DgroupId=com.Nom de la compagnie.helloworld -DartifactId=helloworld-DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
Il devrait créer la structure de dossiers et générer la sortie qui ressemble à ceci :
[INFO] Recherche de projets…[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:3.0.0:generate (default-cli) > generate-sources
@ pom autonome >>>
[INFO]
[INFO] <<< maven-archetype-plugin:3.0.0:generate (default-cli) < generate-sources
@ pom autonome <<<
[INFO]
[INFO]
[INFO] --- maven-archetype-plugin:3.0.0:générer (default-cli) @ standalone-pom ---
[INFO] Génération de projet en mode Batch
[INFO] ----------------------------------------------------------------------------
[INFO] Utilisation des paramètres suivants pour créer un projet à partir de l'ancien (1.x) Archétype :
maven-archetype-quickstart:1.0
[INFO] ----------------------------------------------------------------------------
[INFO] Paramètre : basedir, Valeur : /Users/zak/_work/LearnBuildScripts/LearnMaven
[INFO] Paramètre : package, Valeur : com.Nom de la compagnie.Bonjour le monde
[INFO] Paramètre : groupId, Valeur : com.Nom de la compagnie.Bonjour le monde
[INFO] Paramètre : artefactId, Valeur : helloworld
[INFO] Paramètre : packageName, Valeur : com.Nom de la compagnie.Bonjour le monde
[INFO] Paramètre : version, Valeur : 1.0-INSTANTANÉ
[INFO] projet créé à partir de Old (1.x) Archétype dans dir : /Users/zak/_work/
LearnBuildScripts/LearnMaven/helloworld
[INFO] ------------------------------------------------------------------------
[INFO] CONSTRUIRE LE SUCCÈS
[INFO] ------------------------------------------------------------------------
[INFO] Durée totale : 8.602 s
[INFO] Terminé à: 2018-01-27T00:05:37-08:00
[INFO] Mémoire finale : 15 M/152 M
[INFO] ------------------------------------------------------------------------
La structure des dossiers devrait ressembler à ceci :
Bonjour le monde|-- pompon.xml
'-- src
|-- principal
| '-- java
| '-- com
| '-- Nom de la compagnie
| '-- Bonjour le monde
| '-- Application.Java
'-- test
'-- java
'-- com
'-- Nom de la compagnie
'-- Bonjour le monde
'-- AppTest.Java
Le pompon.xml contient les configurations de construction. À l'intérieur du pompon.xml le code ressemble à ceci :
_0.xsd">
Vous pouvez générer le fichier jar à l'aide de la commande suivante :
Forfait $ mvn[INFO] Recherche de projets…
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Construire helloworld 1.0-INSTANTANÉ
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:ressources (ressources par défaut) @ helloworld ---
[AVERTISSEMENT] En utilisant l'encodage de la plate-forme (UTF-8 en fait) pour copier les ressources filtrées, je.e.
la construction dépend de la plate-forme!
[INFO] ignore le répertoire de ressources non existant /Users/zak/_work/LearnBuildScripts/LearnMaven/
helloworld/src/main/ressources
[INFO]
[INFO] --- maven-compiler-plugin:3.1: compiler (compilation par défaut) @ helloworld ---
[INFO] Modifications détectées - recompilation du module!
[AVERTISSEMENT] Le codage du fichier n'a pas été défini, en utilisant le codage de plate-forme UTF-8, i.e. construire est
dépendant de la plate-forme!
[INFO] Compiler 1 fichier source dans /Users/zak/_work/LearnBuildScripts/LearnMaven/
helloworld/cible/classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @
Bonjour le monde ---
[AVERTISSEMENT] En utilisant l'encodage de la plate-forme (UTF-8 en fait) pour copier les ressources filtrées, je.e.
la construction dépend de la plate-forme!
[INFO] ignore le répertoire de ressources non existant /Users/zak/_work/LearnBuildScripts/LearnMaven/
helloworld/src/test/ressources
[INFO]
[INFO] --- maven-compiler-plugin:3.1: testCompile (default-testCompile) @ helloworld ---
[INFO] Modifications détectées - recompilation du module!
[AVERTISSEMENT] Le codage du fichier n'a pas été défini, en utilisant le codage de plate-forme UTF-8, i.e. construire est
dépendant de la plate-forme!
[INFO] Compiler 1 fichier source dans /Users/zak/_work/LearnBuildScripts/LearnMaven
/helloworld/target/test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4: test (test par défaut) @ helloworld ---
[INFO] Répertoire des rapports Surefire : /Users/zak/_work/LearnBuildScripts/LearnMaven
/helloworld/cible/
rapports infaillibles
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Com en cours d'exécution.Nom de la compagnie.Bonjour le monde.AppTest
Tests exécutés : 1, Échecs : 0, Erreurs : 0, Ignorés : 0, Temps écoulé : 0.014 s
Résultats :
Tests exécutés : 1, Échecs : 0, Erreurs : 0, Ignorés : 0
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (jar par défaut) @ helloworld ---
[INFO] Création de jar : /Users/zak/_work/LearnBuildScripts/LearnMaven/helloworld/target/
helloworld-1.0-INSTANTANÉ.pot
[INFO] ------------------------------------------------------------------------
[INFO] CONSTRUIRE LE SUCCÈS
[INFO] ------------------------------------------------------------------------
[INFO] Durée totale : 5.624 s
[INFO] Terminé à: 2018-01-27T00:11:10-08:00
[INFO] Mémoire finale : 16 M/114 M
[INFO] ------------------------------------------------------------------------
Vous pouvez exécuter le fichier jar comme ceci :
$ java -cp cible/helloworld-1.0-INSTANTANÉ.pot com.Nom de la compagnie.Bonjour le monde.ApplicationBonjour le monde!
Le fichier jar est placé dans le dossier cible.
Gradle
Gradle combine la puissance de Ant et Maven. La première version de Gradle est sortie en 2012. Il a connu une adoption rapide. Google l'utilise actuellement pour Android OS.
Au lieu de XML, Gradle utilise le langage Groovy. En conséquence, les scripts de construction dans Gradle sont plus faciles à écrire et à lire. Il utilisait initialement Ivy pour la gestion des dépendances, mais il utilise maintenant son propre moteur de dépendances.
Avantages
- Fournit une standardisation tout en restant flexible
- Scripts de construction faciles à lire et à écrire
- Mieux gérer plusieurs versions de dépendances
- Capable de gérer plusieurs langages et technologies de programmation
- Communauté active aidant à développer l'outil
- Gradle DSL (Domain-Specific Language) simplifie la structure de configuration
- Gradle fournit des améliorations de performances en utilisant de manière incrémentielle, le cache de construction et le démon Gradle
Les inconvénients
- L'intégration IDE n'est pas aussi bonne que Maven
Exemple de gradation
Vous pouvez installer Gradle à partir d'ici. Une fois que vous avez configuré Gradle dans votre chemin, vous pouvez le vérifier en :
$ gradle --version------------------------------------------------------------
4e année.5
------------------------------------------------------------
Heure de création : 2018-01-24 17:04:52 UTC
Révision : 77d0ec90636f43669dc794ca17ef80dd65457bec
Super : 2.4.12
Ant : Apache Ant(TM) version 1.9.9 compilé le 2 février 2017
JVM : 1.8.0_74 (Oracle Corporation 25.74-b02)
Système d'exploitation : Mac OS X 10.11.6 x86_64
Ensuite, créez la structure de répertoires suivante :
Bonjour le monde|-- construire.graduer
'-- src
|-- principal
'-- java
'-- Bonjour le monde
'-- Bonjour le monde.Java
Pour le helloworld.java a mis le code de l'exemple Ant. Et pour construire.gradle a mis le code suivant :
appliquer le plugin : 'java'version = '1.0'
référentiels
mavenCentral()
dépendances
groupe testCompile : 'junit', nom : 'junit', version : '4.12'
Vous pouvez utiliser la commande « gradle tasks -all » pour consulter toutes les commandes disponibles. Gradle récupère automatiquement les plugins que vous spécifiez dans la construction.gradle et vous montre les tâches supplémentaires disponibles grâce aux plugins.
Vous pouvez obtenir la compilation en exécutant :
$ pot gradleCONSTRUISEZ AVEC SUCCÈS en 1s
2 tâches exploitables : 2 exécutées
Vous pouvez exécuter votre pot comme ceci :
$ java -cp build/libs/helloworld-1.0.pot helloworldBonjour le monde!
Le fichier jar est placé dans le dossier build/libs.
Conclusion
Parmi les outils de construction, Ant peut être utile pour les petits projets tandis que Maven est meilleur pour s'assurer que tous les développeurs suivent les mêmes règles. Gradle est le dernier outil qui offre le plus de flexibilité.
Les références:
- http://fourmi.apache.org/
- http://fourmi.apache.org/lierre/
- https://maven.apache.org/
- https://gradle.org/
- http://makble.com/gradle-junit-helloworld-example
- https://exemples.javacodegeeks.com/core-java/gradle/gradle-hello-world-tutorial/
- https://gradle.org/maven-vs-gradle/
- https://maven.apache.org/guides/getting-started/maven-in-five-minutes.html
- https://stackoverflow.com/questions/20755437/java-build-tools-ant-vs-maven
- https://conversations technologiques.com/2014/06/18/build-tools/
- https://www.quora.com/Quels-sont-les-avantages-et-inconvénients-de-Maven-versus-Ant-as-building-tools-for-Java