Quelle est la différence entre la portée maven compile
et le provided
moment où l'artefact est créé en tant que JAR? Si c'était WAR, je comprendrais - l'artefact serait inclus ou non dans WEB-INF / lib. Mais dans le cas d'un JAR, 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 provided
dépendances ne sont pas transitives - mais est-ce seulement une différence?
JAR packaging
contexte. Maven doc n'en parle pas. J'utilise Maven depuis un certain temps, mais je me suis déjà posé des questions à ce sujet :) Il semble donc que dans leJAR packaging
contexte, il n'y a pas de différence entrecompile
etprovided
(sauf transition de dépendance). Ai-je raison?compile
et ne le seront pas si la portée estprovided
.Voici la référence.
la source
mvn exec:java
son exécution, mais une dépendance compilée l'est.Si vous prévoyez de générer un seul fichier JAR avec toutes ses dépendances (le xxxx-all.jar typique), alors la portée est importante, car les classes à l'intérieur de cette portée ne seront pas incluses dans le JAR résultant.
Voir maven-assembly-plugin pour plus d'informations
la source
maven-assembly-plugin
, intéressant que les réponses les plus votées ne le mentionnent pas.Rendez disponible dans le chemin de classe, n'ajoutez pas cette dépendance dans le pot final s'il s'agit d'un pot normal; mais ajoutez ce pot dans le pot si le pot final est un seul pot (par exemple, un pot exécutable)
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'est-à-dire un pot exécutable, etc.)
la source
Pour un fichier jar, la différence réside dans le chemin de classe répertorié dans le fichier MANIFEST.MF inclus dans le jar si addClassPath est défini sur true dans la configuration maven-jar-plugin. les dépendances «compiler» apparaîtront dans le manifeste, les dépendances «fournies» ne le seront pas.
Une de mes bêtes noires est que ces deux mots devraient avoir le même temps. Soit compilé et fourni, soit compilé et fourni.
la source
Lorsque vous définissez maven scope comme
provided
, cela signifie que lorsque le plug-in s'exécute, la version des dépendances réelle utilisée dépend de la version d'Apache Maven que vous avez installée.la source
Si le fichier jar est similaire au fichier jar Spring Boot exécutable, la portée de toutes les dépendances doit être
compile
d'inclure tous les fichiers jar.Mais si le fichier jar est utilisé dans d'autres packages ou applications, il n'a pas besoin d'inclure toutes les dépendances dans le fichier jar car ces packages ou applications peuvent fournir d'autres dépendances elles-mêmes.
la source