Différence entre la compilation de la scope maven et celle fournie pour le packaging JAR

Quelle est la différence entre la comstack étendue de comstack et celle provided lorsque l’artefact est créé en tant que fichier JAR? Si c’était WAR, je comprendrais – l’artefact serait inclus ou non dans WEB-INF / lib. Mais dans le cas d’un JAR, peu importe – les dépendances ne sont pas incluses. Ils doivent être sur classpath lorsque leur scope est comstack ou provided . Je sais que les dépendances provided ne sont pas transitives – mais est-ce seulement une différence?

Related of "Différence entre la compilation de la scope maven et celle fournie pour le packaging JAR"

Du Maven Doc :

  • comstackr

    C’est la scope par défaut, utilisée si aucune n’est spécifiée. Les dépendances de compilation sont disponibles dans tous les classpath d’un projet. De plus, ces dépendances sont propagées à des projets dépendants.

  • à condition de

    Cela ressemble beaucoup à la compilation, mais indique que le JDK ou un conteneur doit fournir la dépendance à l’exécution. Par exemple, lors de la création d’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 la scope fournie car le conteneur Web fournit ces classes. Cette scope est uniquement disponible sur le classpath de compilation et de test et n’est pas transitive.

Résumer:

  • les dépendances ne sont pas transitives (comme vous l’avez mentionné)
  • La scope fournie n’est disponible que dans le chemin de classes de compilation et de test, tandis que la scope de compilation est disponible dans tous les chemins de classes.
  • les dépendances fournies ne sont pas empaquetées

Comstackr signifie que vous avez besoin du JAR pour comstackr et exécuter l’application. Pour une application Web, par exemple, le fichier JAR sera placé dans le répertoire WEB-INF / lib.

Cela signifie que vous avez besoin du fichier JAR pour la compilation, mais au moment de l’exécution, il existe déjà un fichier JAR fourni par l’environnement. Vous n’avez donc pas besoin qu’il soit fourni 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 une application Web, si le serveur d’applications fournit déjà le fichier JAR (ou ses fonctionnalités), utilisez “provided”, sinon utilisez “comstack”.

Voici la référence.

Si vous prévoyez de générer un seul fichier JAR avec toutes ses dépendances (le fichier xxxx-all.jar classique), vous devez vous assurer que la scope est importante car les classes de cette étendue ne seront pas incluses dans le fichier JAR résultant.

Voir maven-assembly-plugin pour plus d’informations

Voici le brief sur toutes les dépendances supscopes (source maven doc )

comstackr

C’est la scope par défaut, utilisée si aucune n’est spécifiée. Les dépendances de compilation sont disponibles dans tous les classpath d’un projet. De plus, ces dépendances sont propagées à des projets dépendants.

à condition de

Cela ressemble beaucoup à la compilation, mais indique que le JDK ou un conteneur doit fournir la dépendance à l’exécution. Par exemple, lors de la création d’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 la scope fournie car le conteneur Web fournit ces classes. Cette scope est uniquement disponible sur le classpath de compilation et de test et n’est pas transitive.

temps d’exécution

Cette étendue indique que la dépendance n’est pas requirejse pour la compilation, mais pour l’exécution. C’est dans le runtime et les classes de test, mais pas le classpath de compilation.

tester

Cette étendue indique que la dépendance n’est pas requirejse pour une utilisation normale de l’application et n’est disponible que pour les phases de compilation et d’exécution des tests. Cette scope n’est pas transitive.

système

Cette étendue est similaire à celle fournie sauf que vous devez fournir le fichier JAR qui le contient explicitement. L’artéfact est toujours disponible et n’est pas recherché dans un référentiel.

importation (disponible uniquement dans Maven 2.0.9 ou ultérieur)

Cette scope est uniquement prise en charge sur une dépendance de type pom dans la section. Il indique la dépendance à remplacer par la liste effective des dépendances dans la section du POM spécifiée. Depuis leur remplacement, les dépendances à scope d’importation ne participent pas réellement à la limitation de la transitivité d’une dépendance.

  • comstackr

Rendre disponible dans le chemin de classe, n’ajoutez pas cette dépendance dans le fichier jar final si c’est un fichier jar normal; mais ajoutez ce pot dans le pot si le pot final est un pot unique (par exemple, un pot exécutable)

  • à condition de

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

Pour un fichier jar, la différence est dans le classpath répertorié dans le fichier MANIFEST.MF inclus dans le fichier JAR si addClassPath est défini sur true dans la configuration maven-jar-plugin. Les dépendances «comstackr» apparaîtront dans le manifeste, les dépendances «fournies» ne le seront pas.

Un de mes bêtes noires est que ces deux mots doivent avoir le même temps. Soit compilé et fourni, soit compilé et fourni.