web-dev-qa-db-fra.com

Dépendance «fournie» à Gradle

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?

18
ps-aux

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.

41
Sazzadur Rahaman

À partir de la version 2.12, vous pouvez utiliser l'option compileOnly.

Voir

https://blog.gradle.org/introducing-compile-only-dependencies

5
PaulNUK

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.

0
gagarwa