Maven Dependency Scopes

Maven Dependency Scopes

1. introduction

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

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 Mavendirect ettransitive.

Les dépendances directes sont celles explicitement incluses dans le projet. Ceux-ci peuvent être inclus dans le projet à l'aide des balises<dependency>:


    junit
    junit
    4.12

Transitive dependencies, on the other hand, are dependencies required by our direct dependencies. 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 la commande:mvn dependency:tree.

3. Étendues de dépendance

Les portées de dépendance peuvent aider à limiter la transitivité des dépendances et modifient le chemin d'accès aux classes pour différentes tâches construites. Maven has 6 default dependency scopes.

Et il est important de comprendre que chaque étendue - à l'exception deimport - 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 marquerdependencies that should be provided at runtime by JDK or a container, d'où le nom.

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

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éeprovided:


    javax.servlet
    servlet-api
    2.5
    provided

Les dépendances deprovided 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

The dependencies with this scope are required at runtime, mais ils ne sont pas nécessaires pour la compilation du code du projet. Pour cette raison, les dépendances marquées avec la portéeruntime seront présentes lors de l'exécution et le chemin de classe de test, mais elles seront absentes du chemin de classe de compilation.

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


    mysql
    mysql-connector-java
    6.0.6
    runtime

3.4. Test

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. Test dependencies aren’t transitive and are only present for test and execution classpaths.

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


    junit
    junit
    4.12
    test

3.5. Système

System scope is much similar to the provided scope. La principale différence entre ces deux portées est quesystem nous oblige à pointer directement vers un fichier jar spécifique sur le système.

La chose importante à retenir est que la construction du projet avec les dépendances d'étendue desystem 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 lequelsystemPath pointe:


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

3.6. Importation

Cette portée a été ajoutée dans Maven 2.0.9 etit’s only available for the dependency type pom.. Nous parlerons plus en détail du type de dépendance dans les prochains articles.

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


    com.example
    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 différentes portées.

Cependant, les dépendances avec les étenduesprovided ettest ne seront jamais incluses dans le projet principal.

Ensuite:

  • Pour la portéecompile, toutes les dépendances avecruntime scope seront extraites avec la portéeruntime, dans le projet et toutes les dépendances avec la portéecompile seront extraites avec la Périmètrecompile, dans le projet

  • Pour la portéeprovided, les dépendances de portéeruntime etcompile seront extraites avec la portéeprovided, dans le projet

  • Pour la portéetest, les dépendances transitives de portéeruntime etcompile seront extraites avec la portéetest, dans le projet

  • Pour la portéeruntime, les dépendances transitives de portéeruntime etcompile seront extraites avec la portéeruntime, dans le projet

5. Conclusion

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

Si vous voulez approfondir Maven, ledocumentation est un excellent point de départ.