В 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

Чтобы сохранить ваш чистый файл, мы можем сгруппировать зависимости в массив и реализовать их позже.

  1. Добавьте версию таких библиотек в build.gradle (уровень приложения) вне блока зависимостей:

//объявляем версии библиотеки

final RetrofitVersion = '2.3.0'
final OkHttpVersion = '3.9.1'
  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}"
]
  1. И в блоке зависимостей:

//Реализуем всю зависимость от массива

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()
}