Étendues de dépendance Maven

1. Introduction

Maven est l'un des outils de construction les plus populaires de l'écosystème Java, et l'une de ses fonctionnalités principales est la gestion des dépendances.

Dans cet article, nous allons décrire et explorer le mécanisme qui aide à gérer les dépendances transitives dans les projets Maven - les étendues de dépendance.

2. Dépendance transitive

En termes simples, il existe deux types de dépendances dans Maven directe et transitive.

Les dépendances directes sont celles qui sont explicitement incluses dans le projet. Ceux-ci peuvent être inclus dans le projet en utilisant Mots clés:

 junit junit 4.12 

Les dépendances transitives, en revanche, sont des dépendances requises par nos dépendances directes. Les dépendances transitives requises sont automatiquement incluses dans notre projet par Maven.

Nous pouvons lister toutes les dépendances, y compris les dépendances transitives dans le projet en utilisant: mvn dependency: tree command.

3. Étendues de dépendance

Les étendues de dépendance peuvent aider à limiter la transitivité des dépendances et elles modifient le chemin de classe pour différentes tâches générées. Maven a 6 étendues de dépendance par défaut .

Et il est important de comprendre que chaque étendue - à l'exception de l' importation - a un impact sur les dépendances transitives.

3.1. Compiler

Il s'agit de la portée par défaut lorsqu'aucune autre étendue n'est fournie.

Les dépendances avec cette étendue sont disponibles sur le chemin de classe du projet dans toutes les tâches de génération et elles sont propagées aux projets dépendants.

Plus important encore, ces dépendances sont également transitives:

 commons-lang commons-lang 2.6 

3.2. À condition de

Cette portée est utilisée pour marquer les dépendances qui doivent être fournies au moment de l'exécution par JDK ou un conteneur , d'où le nom.

Un bon cas d'utilisation pour cette étendue serait une application Web déployée dans un conteneur, où le conteneur fournit déjà certaines bibliothèques lui-même.

Par exemple, un serveur Web qui fournit déjà l'API Servlet au moment de l'exécution, donc dans notre projet, ces dépendances peuvent être définies avec la portée fournie :

 javax.servlet servlet-api 2.5 provided 

Les dépendances fournies ne sont disponibles qu'au moment de la compilation et dans le chemin de classe de test du projet; de plus, ils ne sont pas transitifs.

3.3. Durée

Les dépendances avec cette étendue sont requises au moment de l'exécution , mais elles ne sont pas nécessaires pour la compilation du code du projet. Pour cette raison, les dépendances marquées avec la portée d' exécution seront présentes dans le chemin de classe d'exécution et de test, mais elles seront absentes du chemin de classe de compilation.

Un bon exemple de dépendances qui devraient utiliser la portée d'exécution est un pilote JDBC:

 mysql mysql-connector-java 6.0.6 runtime 

3.4. Tester

Cette étendue est utilisée pour indiquer que la dépendance n'est pas requise au moment de l'exécution standard de l'application, mais n'est utilisée qu'à des fins de test. Les dépendances de test ne sont pas transitives et ne sont présentes que pour les chemins de classe de test et d'exécution.

Le cas d'utilisation standard de cette portée est l'ajout d'une bibliothèque de test telle que JUnit à notre application:

 junit junit 4.12 test 

3.5. Système

La portée du système est très similaire à la portée fournie . La principale différence entre ces deux portées est que le système nous oblige à pointer directement vers un bocal spécifique sur le système.

La chose importante à retenir est que la construction du projet avec des dépendances de portée système peut échouer sur différentes machines si les dépendances ne sont pas présentes ou sont situées à un endroit différent de celui vers lequel pointe systemPath :

 com.baeldung custom-dependency 1.3.2 system ${project.basedir}/libs/custom-dependency-1.3.2.jar 

3.6. Importer

Cette portée a été ajoutée dans Maven 2.0.9 et n'est disponible que pour le type de dépendance pom . Nous parlerons plus en détail du type de dépendance dans les prochains articles.

L'importation indique que cette dépendance doit être remplacée par toutes les dépendances effectives déclarées dans son POM:

 com.baeldung custom-project 1.3.2 pom import 

4. Portée et transitivité

Chaque étendue de dépendance affecte les dépendances transitives à sa manière. Cela signifie que différentes dépendances transitives peuvent se retrouver dans le projet avec des portées différentes.

Cependant, les dépendances avec les étendues fournies et le test ne seront jamais incluses dans le projet principal.

Ensuite:

  • Pour l' étendue de compilation , toutes les dépendances avec l' étendue d'exécution seront extraites avec l' étendue d' exécution , dans le projet et toutes les dépendances avec l' étendue de compilation seront extraites avec l' étendue de compilation , dans le projet
  • Pour l' étendue fournie , les dépendances d' exécution et d' étendue de compilation seront extraites avec l' étendue fournie , dans le projet
  • Pour la portée du test , les dépendances transitives de la portée d' exécution et de compilation seront extraites avec la portée du test , dans le projet
  • Pour la portée d' exécution , les dépendances transitives de la portée d' exécution et de compilation seront extraites avec la portée d' exécution , dans le projet

5. Conclusion

Dans ce rapide didacticiel, nous nous sommes concentrés sur les étendues de dépendance Maven, leur objectif et les détails de leur fonctionnement.

Si vous souhaitez approfondir Maven, la documentation est un excellent point de départ.