В Gradle, как объявить общие зависимости в одном месте?
В Maven есть очень полезная функция, когда вы можете определить зависимость в разделе <dependencyManagement>
родительского POM и ссылаться на эту зависимость от дочерних модулей без указания версии или области действия или что-то еще.
Каковы альтернативы в Gradle?
Ответы
Ответ 1
Вы можете объявлять общие зависимости в родительском script:
ext.libraries = [ // Groovy map literal
spring_core: "org.springframework:spring-core:3.1",
junit: "junit:junit:4.10"
]
Из дочернего script вы можете использовать объявления зависимостей следующим образом:
dependencies {
compile libraries.spring_core
testCompile libraries.junit
}
Чтобы разделить объявления зависимостей с расширенными параметрами конфигурации, вы можете использовать DependencyHandler.create
:
libraries = [
spring_core: dependencies.create("org.springframework:spring-core:3.1") {
exclude module: "commons-logging"
force = true
}
]
Несколько зависимостей могут совместно использоваться под тем же именем:
libraries = [
spring: [ // Groovy list literal
"org.springframework:spring-core:3.1",
"org.springframework:spring-jdbc:3.1"
]
]
dependencies { compile libraries.spring }
затем добавит обе зависимости сразу.
Единственная информация, которую вы не можете использовать таким образом, - это конфигурация (область действия в терминах Maven), на которую должна быть назначена зависимость. Однако, по моему опыту, в любом случае лучше быть явным.
Ответ 2
Это поздний ответ, но вы также можете посмотреть: http://plugins.gradle.org/plugin/io.spring.dependency-management
Он предоставляет возможность импортировать maven 'bom' и повторно использовать определения, определенные в 'bom'.
Это, безусловно, хорошая помощь, когда вы постепенно переходите от maven до gradle! Наслаждайтесь этим прямо сейчас.
Ответ 3
Начиная с версии 4.6, в документации предлагаются ограничения зависимостей как способ достижения этого. С https://docs.gradle.org/current/userguide/declaring_dependencies.html#declaring_a_dependency_without_version:
Рекомендуемая практика для более крупных проектов - объявлять зависимости без версий и использовать ограничения зависимостей для объявления версий. Преимущество заключается в том, что ограничения зависимостей позволяют вам управлять версиями всех зависимостей, включая транзитивные, в одном месте.
В вашем родительском файле build.gradle
:
allprojects {
plugins.withType(JavaPlugin).whenPluginAdded {
dependencies {
constraints {
implementation("com.google.guava:guava:27.0.1-jre")
}
}
}
}
Обертывание блока зависимостей проверкой подключаемого модуля Java (... whenPluginAdded {
) не является строго необходимым, но затем оно будет обрабатывать добавление не-Java-проекта в ту же сборку.
Тогда в дочернем проекте gradle вы можете просто опустить версию:
apply plugin: "java"
dependencies {
implementation("com.google.guava:guava")
}
Дочерние сборки все еще могут выбрать более высокую версию. Если указана более низкая версия, она автоматически обновляется до версии в ограничении.
Ответ 4
io.spring.gradle:dependency-management-plugin
плагин имеет проблемы с новыми Gradle 3.x сериями, но стабильными для серии 2.x. Для справки смотрите отчет об ошибке Поддержка Drop для Gradle 3 # 115
В случае Spring (основного промоутера использования спецификации) вы можете завершить:
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'
}
Обратите внимание, что io.spring.platform:platform-bom
имеет org.springframework.boot:spring-boot-starter-parent
как родительский, поэтому он совместим с Spring Boot
Вы можете проверить фактическое разрешение зависимостей с помощью:
$ gradle dependencies
$ gradle dependencies --configuration compile
$ gradle dependencies -p $SUBPROJ
$ gradle buildEnvironment
$ gradle buildEnvironment -p $SUBPROJ
или с задачей:
task showMeCache {
configurations.compile.each { println it }
}
Прочтите официальное сообщение Soring в блоге Лучшее управление зависимостями для Gradle, чтобы понять причину введения io.spring.gradle:dependency-management-plugin
.
Ответ 5
В этом сообщении в блоге предлагается управлять зависимостями и группами как конфигурациями:
https://www.javacodegeeks.com/2016/05/manage-dependencies-gradle-multi-project-build.html
Я сам не пробовал, но выглядит интересно.
Корневой проект build.gradle
subprojects {
configurations {
commonsIo
}
dependencies {
commonsIo 'commons-io:commons-io:2.5'
}
}
Подпроект build.gradle
configurations {
compile.extendsFrom commonsIo
}
Ответ 6
Вы можете централизовать зависимость, используя приведенный ниже код:
В gradle.properties
COMPILE_SDK_VERSION=26
BUILD_TOOLS_VERSION=26.0.1
TARGET_SDK_VERSION=26
MIN_SDK_VERSION=14
ANDROID_SUPPORT_VERSION=26.0.2
В каждом модуле добавьте build.gradle
:
android {
compileSdkVersion COMPILE_SDK_VERSION as int
buildToolsVersion BUILD_TOOLS_VERSION as String
defaultConfig {
minSdkVersion MIN_SDK_VERSION as int
targetSdkVersion TARGET_SDK_VERSION as int
versionCode 1
versionName "1.0"
}
}
dependencies {
compile "com.android.support:appcompat-v7:${ANDROID_SUPPORT_VERSION}"
compile "com.android.support:support-v4:${ANDROID_SUPPORT_VERSION}"
compile "com.android.support:support-annotations:${ANDROID_SUPPORT_VERSION}"
compile "com.android.support:support-vector-drawable:${ANDROID_SUPPORT_VERSION}"
compile "com.android.support:design:${ANDROID_SUPPORT_VERSION}"
}
Ответ 7
Чтобы сохранить ваш чистый файл, мы можем сгруппировать зависимости в массив и реализовать их позже.
- Добавьте версию таких библиотек в build.gradle (уровень приложения) вне блока зависимостей:
//объявляем версии библиотеки
final RetrofitVersion = '2.3.0'
final OkHttpVersion = '3.9.1'
- Создайте массив связанных зависимостей, чтобы вы могли легко найти его позже. Добавьте его в build.gradle (уровень приложения) вне блока зависимостей:
//Использование версии в библиотеке и добавление зависимости вместе с именем доступа (например, модификация (первая))
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()
}
Таким образом, окончательный код будет выглядеть так:
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()
}