Différence entre Maven scope compile et fourni pour l'emballage JAR

Quelle est la différence entre la portée maven compile et provided lorsque l'artefact est construit comme un pot? Si c'était la guerre, je comprendrais-l'artefact serait inclus ou non dans WEB-INF / lib. Mais dans le cas d'un pot, cela n'a pas d'importance - les dépendances ne sont pas incluses. Ils doivent être sur classpath lorsque leur portée est compile ou provided. Je sais que les dépendances provided ne sont pas transitives - mais est-ce seulement une différence?

205
demandé sur Lonely Neuron 2011-07-11 11:24:56

6 réponses

À partir du document Maven :

  • Compiler

    C'est la portée par défaut, utilisée si aucune n'est spécifiée. Compiler les dépendances sont disponibles dans tous les chemins de classe d'un projet. De plus, ces dépendances sont propagées à des projets dépendants.

  • À Condition

    C'est un peu comme compiler, mais indique que vous attendez le JDK ou un conteneur pour fournir la dépendance au moment de l'exécution. Par exemple, lorsque en construisant une application web pour Java Enterprise Edition, vous définissez la dépendance de L'API Servlet et des API Java EE associées sur portée fournie car le conteneur web fournit ces classes. Ce scope est uniquement disponible sur le classpath de compilation et de test, et est pas transitive.

Récapituler:

  • dépendances ne sont pas transitives (comme vous l'avez mentionné)
  • la portée fournie n'est disponible que sur le classpath de compilation et de test, alors que la portée de compilation est disponible dans tous les chemins de classe.
  • les dépendances fournies ne sont pas empaquetées
230
répondu Jacob 2018-04-27 03:47:53

Compile signifie que vous avez besoin du JAR pour compiler et exécuter l'application. pour une application web, par exemple, le fichier JAR sera placé dans le répertoire WEB-INF/lib.

Provided signifie que vous avez besoin du JAR pour la compilation, mais au moment de l'exécution, il existe déjà un JAR fourni par l'environnement, donc vous n'en avez pas besoin emballé avec votre application. pour une application web, cela signifie que le fichier JAR ne sera pas placé dans le répertoire WEB-INF/lib.

Pour un web app, si le serveur d'applications fournit déjà le JAR (ou ses fonctionnalités), utilisez "fourni" sinon utilisez "compiler".

Voici la référence.

239
répondu Owen Cao 2014-09-15 07:44:37

Si vous prévoyez de générer un seul fichier JAR avec toutes ses dépendances (le xxxx-all typique.jar), puis la portée fournie compte, car les classes à l'intérieur de cette portée ne seront pas package dans le JAR résultant.

Voir Maven-assembly-plugin pour plus d'informations

13
répondu jfcorugedo 2014-07-23 13:42:23

Voici le brief sur toutes les dépendances prises en charge (source Maven doc )

Compiler

C'est 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. De plus, ces dépendances sont propagées à des projets dépendants.

Fourni

Cela ressemble beaucoup à la compilation, mais indique que vous attendez du JDK ou d'un conteneur pour fournir la dépendance au moment de l'exécution. Par exemple, lors de la création d'une application web pour Java Enterprise Edition, vous devez définir la dépendance de L'API Servlet et des API Java EE associées sur la portée fournie car le conteneur web fournit ces classes. Cette portée n'est disponible que sur le classpath de compilation et de test, et n'est pas transitive.

Durée d'exécution

Cette portée indique que la dépendance n'est pas requise pour la compilation, mais pour l'exécution. C'est dans les classpaths d'exécution et de test, mais pas dans le classpath de compilation.

Essai

Ce scope 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. Cette portée n'est pas transitive.

Système

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

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

Cette portée est uniquement prise en charge dépendance de type pom dans la section. Il indique la dépendance à remplacer par la liste effective des dépendances dans la section POM spécifiée. Comme elles sont remplacées, les dépendances avec une portée d'importation ne participent pas réellement à la limitation de la transitivité d'une dépendance.

12
répondu Indra Uprade 2018-04-27 03:48:44
  • compiler

Rendez disponible dans le chemin de classe, n'ajoutez pas cette dépendance dans le jar final s'il s'agit d'un jar normal; mais ajoutez ce jar dans le jar si le jar final est un jar unique (par exemple, JAR exécutable)

  • fourni

La dépendance sera disponible à l'environnement d'exécution, donc n'ajoutez pas cette dépendance dans tous les cas; même pas dans un seul jar (c'est-à-dire un JAR exécutable, etc.)

8
répondu Vijay 2015-09-17 05:59:35

Pour un fichier jar, la différence est dans le classpath répertorié dans le manifeste.Fichier MF inclus dans le jar si addClassPath est défini sur true dans la configuration Maven-jar-plugin. les dépendances ' compile 'apparaîtront dans le manifeste, les dépendances' fournies ' ne le seront pas.

Un de mes pet peeves est que ces deux mots devraient avoir le même temps. Soit compilé et fourni, soit compiler et fournir.

3
répondu Rick 2016-07-11 20:11:40