В Gradle, как мне объявить общие зависимости в одном месте? - PullRequest
98 голосов
/ 03 марта 2012

В Maven есть очень полезная функция, когда вы можете определить зависимость в разделе <dependencyManagement> родительского POM и ссылаться на эту зависимость из дочерних модулей без указания версии или области действия или чего-либо еще.

Какие есть альтернативы в Gradle?

Ответы [ 7 ]

165 голосов
/ 03 марта 2012

Вы можете объявить общие зависимости в родительском скрипте:

ext.libraries = [ // Groovy map literal
    spring_core: "org.springframework:spring-core:3.1",
    junit: "junit:junit:4.10"
]

Из дочернего скрипта вы можете использовать объявления зависимостей следующим образом:

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 } будет добавлять обе зависимости одновременно.

Единственная часть информации, которой вы не можете поделиться таким образом, - это какая конфигурация ( scope в терминах Maven) должна быть назначена зависимость.Однако, по моему опыту, в любом случае лучше об этом говорить прямо.

7 голосов
/ 31 октября 2014

Это поздний ответ, но вы также можете посмотреть: http://plugins.gradle.org/plugin/io.spring.dependency-management Это дает возможность импортировать maven 'bom' и повторно использовать определения, определенные в 'bom'. Это, безусловно, хорошая помощь при постепенном переходе от maven к gradle! Наслаждаясь этим прямо сейчас.

4 голосов
/ 03 января 2019

Начиная с Gradle 5.0 (или, возможно, ранее?), Ограничения зависимости предложены в документации как способ достижения этого. От 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")
}

Дочерние сборки все еще могут выбрать более высокую версию. Если указана более низкая версия, она автоматически обновляется до версии в ограничении.

2 голосов
/ 18 февраля 2017
Плагин

io.spring.gradle:dependency-management-plugin имеет проблемы с новой серией Gradle 3.x, но стабильный для серии 2.x.Для справки см. Отчет об ошибке Отключить поддержку 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.

1 голос
/ 01 декабря 2017

В этом блоге предлагается управлять зависимостями и группами в виде конфигураций: 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
}
0 голосов
/ 24 июня 2019

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

  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()
}
0 голосов
/ 02 октября 2017

Вы можете централизовать зависимость, используя следующий код:

В 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}"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...