Dans Maven, il existe une fonctionnalité très utile lorsque vous pouvez définir une dépendance dans la section <dependencyManagement>
du POM parent et référencer cette dépendance à partir de modules enfants sans spécifier la version, l'étendue ou autre.
Quelles sont les alternatives à Gradle?
Vous pouvez déclarer des dépendances communes dans un script parent:
ext.libraries = [ // Groovy map literal
spring_core: "org.springframework:spring-core:3.1",
junit: "junit:junit:4.10"
]
À partir d'un script enfant, vous pouvez ensuite utiliser les déclarations de dépendance comme suit:
dependencies {
compile libraries.spring_core
testCompile libraries.junit
}
Pour partager des déclarations de dépendance avec des options de configuration avancées, vous pouvez utiliser DependencyHandler.create
:
libraries = [
spring_core: dependencies.create("org.springframework:spring-core:3.1") {
exclude module: "commons-logging"
force = true
}
]
Plusieurs dépendances peuvent être partagées sous le même nom:
libraries = [
spring: [ // Groovy list literal
"org.springframework:spring-core:3.1",
"org.springframework:spring-jdbc:3.1"
]
]
dependencies { compile libraries.spring }
ajoutera alors les deux dépendances à la fois.
La seule information que vous ne pouvez pas partager de cette manière est la configuration ( scope en termes Maven) à laquelle une dépendance doit être affectée. Cependant, d'après mon expérience, il vaut mieux être explicite à ce sujet de toute façon.
C'est une réponse tardive, mais vous voudrez peut-être aussi regarder: http://plugins.gradle.org/plugin/io.spring.dependency-management Il offre la possibilité d'importer un maven bom ', et réutilise les définitions définies dans le' bom '. C’est certainement une aide précieuse lorsqu’on passe progressivement de maven à gradle! En profiter dès maintenant.
A partir de Gradle 5.0 (ou peut-être plus tôt?), Des contraintes de dépendance sont suggérées dans la documentation pour y parvenir. De https://docs.gradle.org/current/userguide/declaring_dependencies.html#declaring_a_dependency_without_version :
Une pratique recommandée pour les projets plus importants consiste à déclarer des dépendances sans version et à utiliser des contraintes de dépendance pour la déclaration de version. L'avantage est que les contraintes de dépendance vous permettent de gérer les versions de toutes les dépendances, y compris celles transitives, en un seul endroit.
Dans votre fichier build.gradle
parent:
allprojects {
plugins.withType(JavaPlugin).whenPluginAdded {
dependencies {
constraints {
implementation("com.google.guava:guava:27.0.1-jre")
}
}
}
}
Envelopper le bloc des dépendances avec une vérification du plug-in Java (... whenPluginAdded {
) n'est pas strictement nécessaire, mais il gérera ensuite l'ajout d'un projet non Java à la même construction.
Ensuite, dans un projet de catégorie enfant, vous pouvez simplement omettre la version:
apply plugin: "Java"
dependencies {
implementation("com.google.guava:guava")
}
Les générations enfants peuvent toujours choisir de spécifier une version supérieure. Si une version inférieure est spécifiée, elle est automatiquement mise à niveau vers la version dans la contrainte.
Le plugin io.spring.gradle:dependency-management-plugin
a des problèmes avec la nouvelle série Gradle 3.x, mais est stable pour la série 2.x. Pour référence, consulter le rapport de bogue Suppression de la prise en charge de Gradle 3 # 115
En cas de Spring ( promoteur principal de l'utilisation de la nomenclature ), vous pouvez terminer par:
buildscript {
repositories {
mavenLocal()
jcenter()
}
dependencies {
classpath 'io.spring.gradle:dependency-management-plugin:1.0.0.RELEASE'
}
}
repositories {
mavenLocal()
jcenter()
}
apply plugin: 'Java'
apply plugin: 'io.spring.dependency-management'
dependencyManagement {
imports {
mavenBom 'io.spring.platform:platform-bom:Athens-SR3'
}
}
dependencies {
compile 'org.springframework.boot:spring-boot-starter-web'
testCompile 'org.springframework.boot:spring-boot-starter-test'
}
Notez que io.spring.platform:platform-bom
a pour parent org.springframework.boot:spring-boot-starter-parent
, ce qui le rend compatible avec Spring Boot.
Vous pouvez vérifier la résolution de dépendance actuelle via:
$ gradle dependencies
$ gradle dependencies --configuration compile
$ gradle dependencies -p $SUBPROJ
$ gradle buildEnvironment
$ gradle buildEnvironment -p $SUBPROJ
ou avec tâche:
task showMeCache {
configurations.compile.each { println it }
}
Lisez le billet officiel du blog Soring Meilleure gestion des dépendances pour Gradle pour comprendre la raison de l'introduction de io.spring.gradle:dependency-management-plugin
.
Cet article de blog suggère de gérer les dépendances et les groupes en tant que configurations: https://www.javacodegeeks.com/2016/05/manage-dependencies-gradle-multi-project-build.html
Je n'ai pas essayé moi-même, mais ça a l'air intéressant.
Projet racine build.gradle
subprojects {
configurations {
commonsIo
}
dependencies {
commonsIo 'commons-io:commons-io:2.5'
}
}
Sous-projet build.gradle
configurations {
compile.extendsFrom commonsIo
}
Pour que votre fichier reste propre, nous pouvons regrouper les dépendances dans un tableau et les implémenter ultérieurement.
// déclare les versions de la bibliothèque
final RetrofitVersion = '2.3.0' final OkHttpVersion = '3.9.1'
// Utiliser la version dans la bibliothèque et ajouter une dépendance avec un nom d'accès (comme retrofit (premier))
final networkDependencies = [ retrofit : "com.squareup.retrofit2:retrofit:${RetrofitVersion}", retrofitGsonConverter: "com.squareup.retrofit2:converter-gson:${RetrofitVersion}", retrofitRxJavaAdapter: "com.squareup.retrofit2:adapter-rxjava2:${RetrofitVersion}", okHttp3 : "com.squareup.okhttp3:okhttp:${OkHttpVersion}", okHttp3Logging : "com.squareup.okhttp3:logging-interceptor:${OkHttpVersion}" ]
// Implémente toute la dépendance du tableau
dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation networkDependencies.values() }
Donc le code final ressemblera à ceci:
final RetrofitVersion = '2.3.0'
final OkHttpVersion = '3.9.1'
final networkDependencies = [
retrofit : "com.squareup.retrofit2:retrofit:${RetrofitVersion}",
retrofitGsonConverter: "com.squareup.retrofit2:converter-gson:${RetrofitVersion}",
retrofitRxJavaAdapter: "com.squareup.retrofit2:adapter-rxjava2:${RetrofitVersion}",
okHttp3 : "com.squareup.okhttp3:okhttp:${OkHttpVersion}",
okHttp3Logging : "com.squareup.okhttp3:logging-interceptor:${OkHttpVersion}"
]
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation networkDependencies.values()
}