web-dev-qa-db-fra.com

Quelle est la différence entre ces étendues de dépendance Maven: fourni / compilé / système / import

J'ai lu la documentation et j'ai une certaine compréhension.

Veuillez corriger ou m'informer de la vérité; selon ma compréhension:

  • provided
    Les dépendances doivent se trouver sur la machine sur laquelle vous exécutez le code et doivent être incluses dans le chemin

  • compile
    Les dépendances ne seront pas sur la machine qui exécute le code, alors incluez-les dans la build

  • system
    Exactement les mêmes que ceux fournis, mais vous devez que les dépendances soient strictement présentes dans un fichier jar

  • import
    On dirait qu'il devrait importer les dépendances d'un autre fichier POM mais je ne sais pas comment/pourquoi, donc un peu d'élaboration serait appréciée

32
Programming Noob

Vous êtes faux/ambigu sur provided. Cela signifie: "Ce fichier doit être compilé localement, mais il sera fourni sur le chemin de classe par autre chose pendant l'exécution, donc ne l'incluez pas dans le chemin de classe pour moi." Par exemple, tous les conteneurs Web (par exemple: Tomcat) incluent les pots pour les servlets. Vous devez utiliser provided pour les classes de servlets afin de pouvoir compiler votre code localement, mais vous ne voulez pas remplacer les classes de servlets que Tomcat vous fournit lorsque vous y déployez.


system signifie, "Ces dépendances sont sur le système mon et je veux les pointer directement". Vous voulez éviter cela si vous le pouvez, car une autre personne sur un autre ordinateur n'aura pas nécessairement ces dépendances.

La différence entre provided est plus facile à montrer:

<dependency>
  <groupId>javax.sql</groupId>
  <artifactId>jdbc-stdext</artifactId>
  <version>2.0</version>
  <scope>system</scope>
  <systemPath>${Java.home}/lib/rt.jar</systemPath>
</dependency>

Voyez comment il a cela <systemPath>? Voilà la différence. Vous ne spécifiez pas le chemin avec provided, à condition de savoir comment obtenir la dépendance à partir d'un référentiel. system l'obtient uniquement du système de fichiers votre.


Je n'ai même jamais entendu parler de import. @JigarJoshi lié à http://maven.Apache.org/guides/introduction/introduction-to-dependency-mechanism.html qui dit

importation (uniquement disponible dans Maven 2.0.9 ou version ultérieure)

Cette étendue est uniquement utilisée sur une dépendance de type pom dans le <dependencyManagement> section. Il indique que le POM spécifié doit être remplacé par les dépendances dans la section de ce POM. Puisqu'elles sont remplacées, les dépendances avec une portée d'importation ne participent pas réellement à limiter la transitivité d'une dépendance.

I pensez cela signifie: "prenez toutes les dépendances de ce projet et insérez-les dans ce <dependencyManagement> section. "Quelqu'un me corrige si je me trompe.

54
Daniel Kaplan

Veuillez trouver la signification exacte des oscilloscopes à Maven

J'ai fait référence à Maven http://maven.Apache.org/guides/introduction/introduction-to-dependency-mechanism.html

L'étendue des dépendances est utilisée pour limiter la transitivité d'une dépendance et également pour affecter le chemin de classe utilisé pour diverses tâches de génération.

6 portées sont disponibles:

  • compiler :

    Il s'agit de la portée par défaut, utilisée si aucune n'est spécifiée. Les dépendances de compilation sont disponibles dans tous les chemins de classe d'un projet. En outre, ces dépendances sont propagées aux projets dépendants.

  • fourni :

    Cela ressemble beaucoup à la compilation, mais indique que vous vous attendez à ce que le JDK ou un conteneur fournisse la dépendance au moment de l'exécution. Par exemple, lorsque vous créez une application Web pour Java Enterprise Edition, vous devez définir la dépendance sur l'API Servlet et les API Java EE EE associées à l'étendue fournie car le conteneur Web fournit ces classes. Cette étendue est uniquement disponible sur le chemin de classe de compilation et de test et n'est pas transitive.

  • runtime :

    Cette portée indique que la dépendance n'est pas requise pour la compilation, mais pour l'exécution. Il se trouve dans les chemins de classe d'exécution et de test, mais pas dans le chemin de classe de compilation.

  • test :

    Cette portée indique que la dépendance n'est pas requise pour une utilisation normale de l'application et n'est disponible que pour les phases de compilation et d'exécution des tests.

  • système :

    Cette portée est similaire à celle fournie, sauf que vous devez fournir le JAR qui le contient explicitement. L'artefact est toujours disponible et n'est pas recherché dans un référentiel.

  • importation (uniquement disponible dans Maven 2.0.9 ou version ultérieure) :

    Cette étendue n'est utilisée que sur une dépendance de type pom dans la section. Il indique que le POM spécifié doit être remplacé par les dépendances dans la section de ce POM. Puisqu'elles sont remplacées, les dépendances avec une portée d'importation ne participent pas réellement à limiter la transitivité d'une dépendance.

18
Pavan