Qu'est-ce que Maven? Gestion de la construction et des dépendances pour Java

Apache Maven est une pierre angulaire du développement Java et l'outil de gestion de build le plus utilisé pour Java. Le modèle de configuration simplifié basé sur XML de Maven permet aux développeurs de décrire ou de saisir rapidement les contours de tout projet Java, ce qui facilite le démarrage et le partage de nouveaux projets. Maven prend également en charge le développement piloté par les tests, la maintenance de projet à long terme, et sa configuration déclarative et sa large gamme de plugins en font une option populaire pour CI / CD. Cet article est une introduction rapide à Maven, y compris le POM Maven et la structure de répertoires, ainsi que les commandes pour créer votre premier projet Maven.

Notez que la version la plus récente de Maven à ce jour est Maven 3.6.3.

Maven vs Ant et Gradle

Maven n'est pas le seul outil de construction de l'écosystème Java, bien qu'il soit le plus populaire. Ant, une génération antérieure d'outil de configuration basé sur XML, n'a pas les pratiques standardisées et basées sur les conventions et la gestion des dépendances de Maven, mais offre une flexibilité que vous ne trouverez pas avec Maven. Gradle est un outil plus récent qui s'exécute au-dessus de l'écosystème Maven (en utilisant les référentiels de Maven), mais prend en charge l'utilisation d'un DSL basé sur Groovy ou Kotlin pour la configuration. Tous les trois sont de bons outils de construction en eux-mêmes, et chacun peut être intégré dans un processus CI / CD. Ce qui compte, c'est de choisir celui qui convient à vos besoins et de savoir comment l'utiliser de manière appropriée.

Comment fonctionne Maven

Comme beaucoup d'outils géniaux, Maven prend ce qui était autrefois trop compliqué (l'enfer de la configuration) et le simplifie en parties digestibles. Maven se compose de trois composants:

  • Le POM: Le fichier qui décrit un projet Maven et ses dépendances.
  • Le répertoire: Le format standardisé pour décrire un projet Maven dans le POM.
  • Référentiels: Où les logiciels tiers sont stockés et découverts.

Le POM Maven : Chaque projet Java qui utilise Maven a un fichier POM (Project Object Model) dans son répertoire racine. Le pom.xmldécrit les dépendances du projet et vous indique comment le créer. (Les dépendances sont des logiciels tiers requis par le projet. Quelques exemples courants sont JUnit et JDBC. Voir le référentiel central Maven pour une liste de tous les outils disponibles et des dépendances courantes.)

Le répertoire Maven : Le répertoire Maven implémente ce que l'on appelle la convention sur la configuration , une solution élégante à l'enfer de la configuration. Plutôt que de demander aux développeurs de définir la mise en page et de configurer manuellement les composants pour chaque nouveau projet (comme ce fut le cas avec makefileet Ant), Maven institue une structure de projet commune et propose un format de fichier standard pour décrire son fonctionnement. Il vous suffit de brancher vos besoins, et Maven appelle les dépendances et configure le projet pour vous.

Référentiels centralisés : Enfin, Maven utilise des référentiels centralisés pour découvrir et publier des packages de projet en tant que dépendances. Lorsque vous référencez une dépendance dans votre projet, Maven la découvrira dans le référentiel centralisé, la téléchargera dans un référentiel local et l'installera dans votre projet. La plupart du temps, tout cela est invisible pour vous en tant que développeur.

Accéder aux dépendances Maven

Par défaut, Maven résout les dépendances à partir du référentiel central Maven. Une alternative courante est JCenter, qui dispose d'un ensemble plus large de packages disponibles. Les organisations publient et hébergent également des référentiels internes, qui peuvent être publics ou privés. Pour accéder à un référentiel, vous spécifiez son URL dans le Maven POM, ou vous pouvez demander à Maven de rechercher dans d'autres référentiels.

Installer Maven

Maven est un projet Java, donc avant de l'installer, vous devrez installer le JDK dans votre environnement de développement. (Voir «Qu'est-ce que le JDK? Introduction au kit de développement Java» pour en savoir plus sur le téléchargement et l'installation du JDK.)

Une fois que vous avez configuré votre environnement de développement Java, vous pouvez installer Maven en quelques étapes seulement:

  1. Téléchargez la dernière version de Maven (Maven 3.6.3 au moment de la rédaction de cet article).
  2. Extrayez le apache.mavenfichier .zip dans un endroit pratique.
  3. Placez ce fichier sur votre chemin. Par exemple, sur un système Unix ou Linux: export PATH=$PATH:/home/maven/.

Vous devriez maintenant avoir accès à la mvncommande. Tapez mvn -vpour vous assurer que vous avez correctement installé Maven.

Le Maven POM

La racine de chaque projet Maven est le pom.xmlfichier. Malgré sa réputation d'être fastidieux, XML fonctionne plutôt bien pour ce cas d'utilisation. Le POM de Maven est facile à lire et révèle une grande partie de ce qui se passe dans un projet. (Si vous avez travaillé avec JavaScript, l' pom.xmlobjectif est similaire au package.jsonfichier de Node NPM .)

Le listing 1 montre un Maven très simple pom.xml.

Listing 1. Simple Maven POM

   4.0.0 com.javaworld what-is-maven 1.0-SNAPSHOT Simple Maven Project jar   junit junit 4.12 test    

Comprendre le Maven POM

Une fois que vous avez compris, le POM n'est pas mystérieux. Pour commencer, vous pouvez survoler le préambule XML, qui fait simplement référence au schéma POM officiel. Notez cependant que le XML commence par modelVersion. Cela indique à Maven quelle version du POM utiliser, dans ce cas Maven POM 4.0.0.

Ensuite , vous avez groupId, artifactIdet version. Ensemble, ces trois attributs identifient de manière unique chaque ressource gérée par Maven dans le référentiel. Ces attributs en haut du fichier décrivent votre projet Maven.

Maintenant, jetez un œil à la dependenciessection du POM, où nous décrivons les dépendances du projet. Dans ce cas, nous n'avons inséré qu'une seule dépendance jusqu'à présent, JUnit. Notez que JUnit est également décrit en termes de groupId, artifactIdet version.

Que vous décriviez votre propre projet ou une dépendance de projet, ces valeurs indiquent systématiquement à Maven où trouver un projet dans le référentiel Maven et quelle version est disponible.

Héberger votre projet dans un référentiel Maven

Gardez à l'esprit que le POM définit tout ce dont votre projet a besoin pour s'exécuter, mais il décrit également votre projet comme une dépendance potentielle. Si vous créez un projet qui sera une dépendance - par exemple, en créant une bibliothèque pour d'autres projets à utiliser - vous devrez le rendre disponible de l'une des quatre manières suivantes:

  1. Rendez-le disponible localement.
  2. Publiez dans un référentiel distant géré de manière privée.
  3. Publiez dans un référentiel privé basé sur le cloud.
  4. Publiez dans un référentiel public comme Maven Central.

Dans le premier cas, vous n'utilisez pas du tout de référentiel distant. Au lieu de cela, d'autres développeurs téléchargeront et installeront votre projet localement dans leur dépôt Maven, à l'aide de la mvn installcommande.

Dans le second cas, vous utilisez un référentiel Maven hébergé, en utilisant un serveur privé pour publier et télécharger des dépendances. Pour cela, vous avez besoin d'un gestionnaire de référentiel, comme Apache Archiva.

Une alternative plus récente consiste à utiliser un référentiel distant privé, mais à s'appuyer sur un service cloud pour le gérer, par exemple Cloudsmith. Cela permet de bénéficier de dépendances hébergées à distance sans avoir à mettre en place un serveur de dépôt. Ce service est payant, bien sûr.

Enfin, un petit pourcentage de projets aboutira dans le Central Maven Repository ou JCenter, qui sont destinés aux packages publics largement utilisés. Si vous créez une dépendance open-source à utiliser par d'autres, vous aurez besoin de l'un de ces référentiels centralisés pour rendre votre travail disponible au monde.

  • En savoir plus sur l'hébergement de votre projet dans un référentiel Maven et obtenir une liste des référentiels disponibles.
  • Consultez la documentation officielle Maven sur le Maven Release Plugin, utilisé pour préparer et gérer les logiciels publiés dans un référentiel Maven.

Construire le package Maven

Si vous créez le à pom.xmlpartir du listing 1 et le placez dans un répertoire, vous pourrez exécuter des commandes Maven contre lui. Maven a une multitude de commandes, et d'autres sont disponibles via plugin, mais vous n'avez besoin d'en connaître qu'une poignée pour commencer.

Pour votre première commande, essayez d'exécuter mvn package. Même si vous n'avez pas encore de code source, l'exécution de cette commande indique à Maven de télécharger la dépendance JUnit. Vous pouvez vérifier la sortie de journalisation de Maven pour voir que la dépendance a été chargée.

Périmètre de dépendance

Vous avez peut-être remarqué que la dépendance JUnit dans l'exemple POM est marquée comme scope test. La portée est un concept important dans la gestion des dépendances, vous permettant essentiellement de définir et de limiter la façon dont chaque dépendance sera appelée et utilisée dans votre projet. L' testétendue garantit que la dépendance est disponible lors de l'exécution des tests, mais pas lorsque l'application est empaquetée pour le déploiement.

Une autre portée courante est provided, qui indique au framework que la dépendance est fournie par l'environnement d'exécution. Ceci est souvent observé avec les JARS de servlet lors du déploiement dans un conteneur de servlet, car le conteneur fournira ces JARS. Consultez la documentation Apache Maven pour une liste complète des étendues de dépendance Maven.

Structure des répertoires de Maven

Lorsque la commande est terminée, notez que Maven a créé un /targetrépertoire. C'est l'emplacement standard pour la sortie de votre projet. Les dépendances que vous avez téléchargées résideront dans le /targetrépertoire, avec vos artefacts d'application compilés.

Ensuite, vous voulez ajouter un fichier Java, que vous placerez dans le src/répertoire Maven . Créez un /src/main/java/com/javaworld/Hello.javafichier, avec le contenu du Listing 2.

Listing 2. Hello.java

 com.javaworld public class Hello { public static void main(String[] args){ System.out.println("Hello, JavaWorld"); } } 

Le /srcchemin est l'emplacement standard des fichiers source de votre projet. La plupart des projets placent leurs fichiers principaux /src/main/, les fichiers Java étant placés dans le chemin de classe sous /java. De plus, si vous souhaitez inclure des actifs qui ne sont pas du code, comme des fichiers de configuration ou des images, vous pouvez utiliser /src/main/resources. Les éléments de ce chemin seront ajoutés au chemin de classe principal. Les fichiers de test entrent dans /src/test/java.

Pour passer en revue, voici quelques éléments clés d'une structure de projet Maven (telle que définie par la structure de répertoire standard Maven):

Éléments clés de la structure d'annuaire standard Maven

pom.xml Le fichier descripteur de projet
/ src / main / java Emplacement des fichiers source
/ src / main / resources Emplacement des actifs non sources
/ src / test / java Emplacement des fichiers source de test
/cible Emplacement de la sortie de construction

Gérer votre projet Maven

La mvn packagecommande demande à Maven de regrouper le projet. Exécutez cette commande lorsque vous êtes prêt à rassembler tous vos fichiers de projet en un seul endroit. Rappelez-vous que dans le fichier POM de ce projet, nous définissons le type d'empaquetage sur jar, donc cette commande indique à Maven de regrouper les fichiers d'application dans un JAR.

Maven propose une variété d'options supplémentaires pour contrôler la façon dont le JAR est géré, qu'il s'agisse d'un JAR épais ou léger, et pour spécifier un exécutable mainclass. Consultez la documentation Maven pour en savoir plus sur la gestion de fichiers dans Maven.

Après avoir regroupé un projet, vous voudrez probablement publier un fichier mvn install. Cette commande pousse le projet dans le référentiel Maven local. Une fois dans le référentiel local, il est disponible pour d'autres projets Maven de votre système local. Ceci est utile pour les scénarios de développement où vous et / ou votre équipe créez des fichiers JAR de dépendance qui ne sont pas encore publiés dans un référentiel central.

Commandes Maven supplémentaires

Entrez mvn testlorsque vous êtes prêt à exécuter les tests unitaires que vous avez définis dans le /src/java/testrépertoire.

Entrez mvn compilelorsque vous êtes prêt à compiler les fichiers de classe du projet. Si vous exécutez une configuration de déploiement à chaud, cette commande déclenche le chargeur de classe de déploiement à chaud. (L'outil de déploiement à chaud - comme la mvn spring-boot:runcommande de Spring Boot - surveillera les fichiers de classe pour les modifications, et la compilation entraînera la compilation de vos fichiers source et l'application en cours d'exécution reflétera ces modifications.)

Démarrer un nouveau projet: les archétypes de Maven et Spring

Un archétype Maven est un modèle pour démarrer de nouveaux projets basés sur une variété de paramètres prédéfinis. Chaque archétype offre des dépendances pré-packagées, comme pour un projet d'application Web Java EE ou Java. Vous pouvez également créer un nouvel archétype à partir d'un projet existant, puis l'utiliser pour créer rapidement de nouveaux projets basés sur ces dispositions prédéfinies. Consultez la documentation Maven pour en savoir plus sur les archétypes Apache Maven.

Le framework Spring, qui fonctionne bien avec Maven, offre des fonctionnalités supplémentaires et sophistiquées pour stubbing de nouveaux projets. A titre d'exemple, Spring Initializr est un outil qui vous permet de définir très rapidement les éléments que vous souhaitez dans une nouvelle application. Initializr n'est pas un archétype Maven en soi, mais il sert le même objectif: générer une mise en page de projet basée sur des spécifications initiales. À partir d'Initializr, vous pouvez taper mvn archetype:generateet parcourir les options pour trouver un archétype qui convient à ce que vous construisez.

Ajouter des dépendances