331 votes

Différence entre la compilation maven scope et celle fournie pour l’emballage JAR

Peut-être cette question semble être un cliché, mais ça me dérange quelque peu. Qu'elle différence entre l'utilisation de maven portée compile et provided lors de l'artefact est bâtie comme un POT? Si c'était la GUERRE, alors je comprends - artefact serait attaché ou non à la WEB-INF/lib. Mais dans le cas du POT, il n'a pas d'importance - les dépendances ne sont pas attachés. Ils doivent être sur le chemin de classe lors de leur champ d'application est - compile ou provided. Je sais qu' provided dépendances ne sont pas transitives - mais est-il seulement une différence?

354voto

Owen Tsao Points 1262

Compiler signifie que vous avez besoin de la JARRE de la compilation et de l'exécution de l'application. Pour une application web, par exemple, le POT va être placé dans le dossier WEB-INF/lib du répertoire.

À condition signifie que vous devez le POT pour la compilation, mais au moment de l'exécution, il est déjà un POT offertes par l'environnement de sorte que vous n'avez pas besoin emballés avec votre application. Pour une application web, cela signifie que le fichier JAR ne seront pas placés dans le WEB-INF/lib du répertoire.

Pour une application web, si le serveur d'applications fournit déjà le POT (ou de ses fonctionnalités), puis utilisez la "condition" d'utiliser autrement de "compiler".

Voici la référence.

348voto

Jacob Points 17521

À partir de l' Maven Doc:

  • compiler

C'est l'étendue par défaut, utilisé si aucun n'est spécifié. Compiler les dépendances sont disponibles dans tous les chemins de classe d'un projet. En outre, ces dépendances sont propagées à projets dépendants.

  • fourni

C'est un peu comme de la compilation, mais indique que vous attendez le JDK ou un conteneur pour fournir la dépendance au moment de l'exécution. Par exemple, lorsque création d'une application web pour le Java Enterprise Edition, vous définir la dépendance sur l'API Servlet et liées à Java EE Api pour portée prévue parce que le conteneur web fournit ces classes. Cette champ d'application est uniquement disponible sur la compilation et de test classpath, et est pas transitive.

Récapitulatif:

  • les dépendances ne sont pas transitives (comme vous l'avez mentionné)
  • fourni champ d'application est uniquement disponible sur la compilation et de test classpath, alors que le champ d'application de la compilation est disponible dans tous les chemins de classe.
  • fourni les dépendances ne sont pas emballés

30voto

jfcorugedo Points 328

Si vous avez l’intention de générer un seul fichier JAR avec toutes ses dépendances (le typique xxxx-all.jar), puis fourni matière de portée, parce que les classes à l’intérieur de ce champ ne seront pas le paquet dans le bocal qui en résulte.

Voir maven-assembly-plugin pour plus d’informations

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X