J'ai build.gradle
devant moi et il y a des dépendances déclarées comme provided
mais dans documentation je ne vois pas cette étendue de dépendance.
dependencies {
compile("org.springframework.boot:spring-boot-starter-web:1.2.4.RELEASE")
....
provided 'backport-util-concurrent:backport-util-concurrent:3.1'
provided 'org.javolution:javolution:5.5.1@jar
....
}
Est-ce fourni par un plugin? Si oui, comment savoir à quel plugin il appartient?
Quelle est la différence entre la portée de dépendance provided
et runtime
dans Gradle?
Quelle est la portée de
provided
?
Supposons qu'un jar
soit nécessaire pour compiler votre code, mais le pot est présent dans la collection de bibliothèques d'environnement de production. Ensuite, vous n'avez pas besoin d'emballer le pot avec vos archives de projet. Pour prendre en charge cette exigence, Maven a une étendue nommée provided
. Si vous déclarez une dépendance de jar comme provided
, alors ce jar sera présent dans votre chemin de classe pendant la compilation mais ne sera pas empaqueté avec votre archive de projet.
La portée provided
est très utile, en particulier dans les applications Web. Par exemple, servlet-api.jar
est nécessaire pour être présent dans votre chemin de classe pour compiler votre projet, mais vous n'en avez pas besoin pour empaqueter servlet-api.jar
fichier avec votre war
. Avec la portée provided
, on peut répondre à cette exigence.
Aucune étendue n'est définie dans le plug-in Gradle Java
nommé provided
. Pas non plus dans les plugins war
ou Android
. Si vous souhaitez utiliser la portée provided
dans votre projet, vous devez le définir dans votre build.gradle
fichier. Voici l'extrait de code pour déclarer la portée provided
dans gradle:
configurations {
provided
}
sourceSets {
main { compileClasspath += configurations.provided }
}
Maintenant, votre deuxième question:
Quelle est la différence entre l'étendue de dépendance fournie et l'étendue d'exécution dans Gradle?
Pour répondre à cette question, je définirai d'abord la dépendance compile
. Les dépendances compile
sont des dépendances, celles-ci sont nécessaires pour compiler votre code. Imaginez maintenant que si votre code utilise une bibliothèque nommée X
, vous devez déclarer X
comme dépendance au moment de la compilation. Imaginez également que X
utilise une autre bibliothèque Y
en interne et que vous avez déclaré Y
comme dépendance d'exécution.
Pendant la compilation, Gradle ajoutera X
dans votre chemin de classe mais n'ajoutera pas Y
. Depuis, Y
n'est pas requis pour la compilation. Mais il emballera à la fois X
et Y
avec vos archives de projet car X
et Y
sont nécessaires pour exécuter vos archives de projet dans l'environnement de production. Généralement, toutes les dépendances nécessaires dans l'environnement de production sont appelées dépendances runtime
.
Dans Gradle official documentation , il est dit que les dépendances runtime
sont " les dépendances requises par les classes de production lors de l'exécution. Par défaut, inclut également les dépendances de temps de compilation. ".
Maintenant, si vous avez lu jusqu'ici, vous savez déjà que provided
est une dépendance compile
que nous ne voulons pas être présents dans la dépendance runtime
(essentiellement , nous ne voulons pas qu'il soit empaqueté avec l'archive du projet).
Voici une illustration de la portée provided
et runtime
. Ici, compile
fait référence aux dépendances requises pour compiler le projet et non-compile
fait référence aux dépendances qui ne sont pas requises pour la compilation du projet.
À partir de la version 2.12, vous pouvez utiliser l'option compileOnly.
Voir
https://blog.gradle.org/introducing-compile-only-dependencies
Pour plus de précision, à partir de la dernière version, Gradle 5.5 a des options compileOnly (identiques à celles fournies) et runtimeOnly. La nouvelle option de compilation et d'exécution par défaut est l'implémentation.