Ant vs Maven vs Gradle

Ant vs Maven vs Gradle

1. introduction

Dans cet article, nous allonsexplore three Java build automation tools which dominated the JVM ecosystem – Ant, Maven, and Gradle.

Nous présenterons chacun d'entre eux et explorerons comment les outils d'automatisation de build Java ont évolué.

2. Apache Ant

In the beginning, Make was the only build automation tool, au-delà des solutions maison. Make existe depuis 1976 et en tant que tel, il a été utilisé pour créer des applications Java dans les premières années Java.

Cependant, de nombreuses conventions des programmes C ne correspondaient pas à l'écosystème Java, donc avec le temps, Ant a été publié comme une meilleure alternative.

Apache Ant (“Another Neat Tool”) is a Java library used for automating build processes for Java applications. De plus, Ant peut être utilisé pour créer des applications non Java. Il faisait initialement partie de la base de code Apache Tomcat et a été publié en tant que projet autonome en 2000.

À bien des égards, Ant est très similaire à Make, et c'est assez simple pour que tout le monde puisse commencer à l'utiliser sans aucun prérequis particulier. Les fichiers de construction Ant sont écrits en XML, et par convention, ils sont appelésbuild.xml.

Les différentes phases d'un processus de construction sont appelées «cibles».

Voici un exemple de fichierbuild.xml pour un projet Java simple avec la classe principaleHelloWorld:


    
        
    

    
        
        
    

    
        
        
            
                
            
        
    

    
        
    

Ce fichier de construction définit quatre cibles:clean,compile,jar etrun. Par exemple, nous pouvons compiler le code en lançant:

ant compile

Cela déclenchera d'abord la cibleclean qui supprimera le répertoire «classes». Après cela, la ciblecompile recréera le répertoire et y compilera le dossier src.

The main benefit of Ant is its flexibility. Ant doesn’t impose any coding conventions or project structures. Par conséquent, cela signifie que Ant oblige les développeurs à écrire toutes les commandes par eux-mêmes, ce qui conduit parfois à d'énormes fichiers de construction XML difficiles à maintenir.

Puisqu'il n'y a pas de conventions, le simple fait de connaître Ant ne signifie pas que nous comprendrons rapidement n'importe quel fichier de compilation Ant. Il faudra probablement un certain temps pour s’habituer à un fichier Ant inconnu, ce qui est un inconvénient par rapport aux autres outils plus récents.

Au début, Ant ne disposait d'aucun support intégré pour la gestion des dépendances. Cependant, la gestion des dépendances devenant incontournable ces dernières années,Apache Ivy a été développé en tant que sous-projet du projet Apache Ant. Il est intégré à Apache Ant et suit les mêmes principes de conception.

Cependant, les limitations initiales Ant dues à l'absence de prise en charge intégrée de la gestion des dépendances et aux frustrations liées à l'utilisation de fichiers de génération XML impossibles à gérer ont conduit à la création de Maven.

3. Apache Maven

Apache Maven est un outil de gestion des dépendances et d'automatisation de construction, principalement utilisé pour les applications Java. Maven continues to use XML files just like Ant but in a much more manageable way. Le nom du jeu ici est la convention sur la configuration.

Alors que Ant donne la flexibilité et exige que tout soit écrit à partir de zéro,Maven relies on conventions and provides predefined commands (goals).

En termes simples, Maven nous permet de nous concentrer sur ce que notre construction devrait faire et nous donne le cadre pour le faire. Un autre aspect positif de Maven est qu’il fournit un support intégré pour la gestion de la dépendance.

Le fichier de configuration de Maven, contenant les instructions de construction et de gestion des dépendances, est par convention appelépom.xml. De plus, Maven recommande également une structure de projet stricte, tandis qu'Ant offre également une flexibilité.

Voici un exemple de fichierpom.xml pour le même projet Java simple avec la classe principaleHelloWorld d'avant:


    4.0.0
    example
    mavenExample
    0.0.1-SNAPSHOT
    Maven example

    
        
            junit
            junit
            4.12
            test
        
    

Cependant, la structure du projet a également été normalisée et conforme aux conventions Maven:

+---src
|   +---main
|   |   +---java
|   |   |   \---com
|   |   |       \---example
|   |   |           \---maven
|   |   |                   HelloWorld.java
|   |   |
|   |   \---resources
|   \---test
|       +---java
|       \---resources

Contrairement à Ant, il n'est pas nécessaire de définir manuellement chacune des phases du processus de construction. Au lieu de cela, nous pouvons simplement appeler les commandes intégrées de Maven.

Par exemple, nous pouvons compiler le code en lançant:

mvn compile

À la base, comme indiqué sur les pages officielles,Maven can be considered a plugin execution framework, since all work is done by plugins. Maven prend en charge une large gamme deavailable plugins, et chacun d'eux peut être configuré en plus.

L'un des plugins disponibles est Apache Maven Dependency Plugin qui a pour objectifcopy-dependencies de copier nos dépendances dans un répertoire spécifié.

Pour montrer ce plugin en action, incluons ce plugin dans notre fichierpom.xml et configurons un répertoire de sortie pour nos dépendances:


    
        
            org.apache.maven.plugins
            maven-dependency-plugin
            
                
                    copy-dependencies
                    package
                    
                        copy-dependencies
                    
                    
                        target/dependencies
                          
                    
                
            
        
    

Ce plugin sera exécuté dans une phasepackage, donc si nous exécutons:

mvn package

Nous allons exécuter ce plugin et copier les dépendances dans le dossier target / dependencies.

Il existe également unexisting article sur la façon de créer un JAR exécutable à l'aide de différents plugins Maven. De plus, pour un aperçu détaillé de Maven, jetez un œil àthis core guide on Maven, où certaines fonctionnalités clés de Maven sont explorées.

Maven est devenu très populaire depuis que les fichiers de compilation sont maintenant normalisés et la maintenance des fichiers de compilation prend beaucoup moins de temps que celle de Ant. Cependant, bien que plus standardisés que les fichiers Ant, les fichiers de configuration Maven ont toujours tendance à devenir volumineux et encombrants.

La personnalisation des objectifs deMaven’s strict conventions come with a price of being a lot less flexible than Ant. est très difficile, donc l'écriture de scripts de construction personnalisés est beaucoup plus difficile à faire que Ant.

Bien que Maven ait apporté de sérieuses améliorations pour rendre les processus de construction des applications plus faciles et plus standardisés, il a toujours un prix car il est beaucoup moins flexible que Ant. Cela a conduit à la création de Gradle qui combine le meilleur des deux mondes - la flexibilité d'Ant et les fonctionnalités de Maven.

4. Gradle

Gradle est une gestion des dépendances et un outil d'automatisation de construction quiwas built upon the concepts of Ant and Maven.

L'une des premières choses que nous pouvons noter à propos de Gradle est qu'il n'utilise pas de fichiers XML, contrairement à Ant ou Maven.

Au fil du temps, les développeurs ont été de plus en plus intéressés à utiliser et à utiliser un langage spécifique à un domaine, ce qui leur permettrait simplement de résoudre les problèmes dans un domaine spécifique en utilisant un langage adapté à ce domaine.

Cela a été adopté par Gradle, qui utilise une DSL basée surGroovy. Le fichier de configuration deThis led to smaller configuration files with less clutter since the language was specifically designed to solve specific domain problems. Gradle est appelé par conventionbuild.gradle.

Voici un exemple de fichierbuild.gradle pour le même projet Java simple avec la classe principaleHelloWorld d'avant:

apply plugin: 'java'

repositories {
    mavenCentral()
}

jar {
    baseName = 'gradleExample'
    version = '0.0.1-SNAPSHOT'
}

dependencies {
    compile 'junit:junit:4.12'
}

Nous pouvons compiler le code en lançant:

gradle classes

Gradle fournit intentionnellement très peu de fonctionnalités. Plugins add all useful features. Dans notre exemple, nous utilisions le pluginjava qui nous permet de compiler du code Java et d'autres fonctionnalités intéressantes.

Gradle gave its build steps name “tasks”, as opposed to Ant’s “targets” or Maven’s “phases”. Avec Maven, nous avons utilisé Apache Maven Dependency Plugin, et notre objectif spécifique est de copier les dépendances dans un répertoire spécifié. Avec Gradle, nous pouvons faire la même chose en utilisant des tâches:

task copyDependencies(type: Copy) {
   from configurations.compile
   into 'dependencies'
}

Nous pouvons exécuter cette tâche en exécutant:

gradle copyDependencies

5. Conclusion

Dans cet article, nous avons présenté Ant, Maven et Gradle, trois outils d’automatisation de la compilation Java.

Sans surprise, Maven détient aujourd'hui la majorité desthe build tool market. Gradle, cependant, a constaté une bonne adoption dans des bases de code plus complexes, y compris un certain nombre de projets open source tels que Spring.