111 votes

Différence entre les configurations de compilation et d'exécution dans Gradle

Ma question est un peu commune, mais elle est aussi liée à Gradle.

Pourquoi avons-nous besoin d'une configuration de compilation et d'exécution ?

Lorsque je compile quelque chose, j'ai besoin d'artefacts pour convertir mes classes java en bytecode. J'ai donc besoin de la configuration de la compilation, mais pourquoi ai-je besoin de la configuration de l'exécution ? Ai-je besoin d'autre chose pour exécuter mon application dans la JVM ?

Désolé si ça semble stupide, mais je ne comprends pas.

164voto

Peter Niederwieser Points 36369

Dans le cas le plus courant, les artefacts nécessaires au moment de la compilation sont un sous-ensemble de ceux nécessaires au moment de l'exécution. Par exemple, disons qu'un programme appelé app utilise la bibliothèque foo et la bibliothèque foo en interne utilise la bibliothèque bar . Alors seulement foo est nécessaire pour compiler app mais les deux foo y bar sont nécessaires pour le faire fonctionner. C'est pourquoi, par défaut, tout ce que vous mettez dans le répertoire de Gradle compile est également visible sur son runtime mais le contraire n'est pas vrai.

17voto

Ashish Points 306

Mise à jour de la réponse en fonction des dernières versions de gradle.

Extrait de la documentation officielle de gradle au lien ci-dessous :

https://docs.gradle.org/current/userguide/upgrading_version_5.html

Dépréciations

Les dépendances ne doivent plus être déclarées en utilisant les configurations de compilation et d'exécution L'utilisation des configurations de compilation et d'exécution dans les plugins de l'écosystème Java a été découragée depuis Gradle 3.4.

Les configurations implementation, api, compileOnly et runtimeOnly doivent être utilisées pour déclarer les dépendances et les chemins d'accès compileClasspath et runtimeOnly. runtimeClasspath pour résoudre les dépendances.

De plus, la configuration de la dépendance de compilation a été supprimée dans la version 7.0 de Gradle récemment publiée.

Si vous essayez d'utiliser compile dans votre projet Gradle 3.4+, vous obtiendrez un avertissement comme celui-ci :

Des fonctionnalités obsolètes de Gradle ont été utilisées dans cette version, ce qui la rend incompatible avec Gradle 7.0. Utiliser '-warning-mode all' pour afficher les les avertissements de dépréciation individuels.

Vous devez toujours utiliser implementation plutôt que compile pour les dépendances, et utiliser runtimeOnly au lieu de runtime.

Qu'est-ce qu'une dépendance de mise en œuvre ?

Lorsque vous construisez et exécutez un projet Java, deux classpaths sont impliqués :

Compiler le chemin de classe - Les dépendances qui sont nécessaires pour que le JDK puisse compiler le code Java dans des fichiers .class.

Chemin de classe de l'exécution - Les dépendances qui sont nécessaires pour exécuter le code Java compilé.

Lorsque nous configurons les dépendances de Gradle, nous ne faisons que configurer quelles dépendances doivent apparaître sur quel classpath. Étant donné qu'il n'y a que deux classpaths, il est logique que nous ayons trois options pour déclarer nos dépendances.

  1. compileOnly - mettre la dépendance sur le classpath de la compilation uniquement.
  2. runtimeOnly - placer la dépendance sur le classpath du runtime uniquement.
  3. mise en œuvre - mettre la dépendance sur les deux classpaths.

Utilisez la configuration de la dépendance d'implémentation si vous avez besoin que la dépendance soit à la fois sur les classpaths de compilation et d'exécution. Dans le cas contraire considérez compileOnly ou runtimeOnly.

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