在Gradle中,如何在一个地方声明公共依赖项?


109

在Maven中,当您可以<dependencyManagement>在父POM 的部分中定义依赖项并从子模块引用该依赖项而无需指定版本或范围或任何其他内容时,它具有非常有用的功能。

Gradle有哪些替代方案?

Answers:


179

您可以在父脚本中声明常见的依赖项:

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 } 然后将立即添加两个依赖项。

您不能以这种方式共享的一条信息是应将依赖项分配给哪种配置(以Maven术语表示的范围)。但是,以我的经验来看,最好还是对此进行明确说明。


3
谢谢,这解决了我的问题,但是仍然有一个问题。.在Maven中,我们可以将版本保留为空,如果这是一个lib,这很方便,因为您可以在我们的应用程序中使用它,并使dependencyManagement定义该lib的版本应该。您将如何使用Gradle进行相同操作?
Stanislav Bashkyrtsev 2012年

我不明白这个问题。请提供一个例子。
Peter Niederwieser 2012年

4
彼得,ctapobep的意思是,在Maven中,您可以在dependencyManagement部分的父(或聚合器)pom中声明具有版本(和范围)的依赖项。然后,在“具体” pom中,您无需重新声明版本;只是工件和groupId。基本上,它告诉maven“我需要X:Y,但是使用父级配置的任何版本。”
Michael Campbell

2
为了避免这种重复,我倾向于创建一个单独的dependencies.gradle脚本,在其中我将所有依赖项定义为属性,例如:ext.GROOVY = 'org.codehaus.groovy:groovy-all:2.1.6'。在根项目中build.gradle,我包括allprojects { apply from: "$rootDir/dependencies.gradle" }。然后,所有依赖项都在一个文件中定义,而不是在周围散布,并且在依赖项配置中使用更多“易于读取”的常量。
Steinar 2013年

1
这正是我上面所做的。您不需要申请,allprojects因为项目级的额外属性对子项目可见。
2013年

7

回复很晚,但是您可能还想看看:http : //plugins.gradle.org/plugin/io.spring.dependency-management 它提供了导入maven'bom'并重用定义的可能性在“宝”中定义。从Maven逐渐迁移到gradle时,这无疑是一个很好的帮助!现在享受它。


当您要在多个(多个)项目中共享相同的依赖项时,它甚至是必不可少的。
roomsg 2014年

7
尽管方便,但此插件可能会占用大量性能。对于具有200多个依赖项的30个子项目,它最多需要1分钟才能解决依赖项。对于小型项目,它就像一个魅力一样工作
Jk1

它还覆盖了传递依赖项版本,例如您在依赖项管理中声明了3.0.0版本,但是对于其中一个子项目,您需要使用旧版本,例如2.5.0,那么如果您有一个依赖于该旧项目的项目,则传递依赖将从2.5.0覆盖为在依赖管理插件中声明的内容,因此3.0.0在这种情况下是一种非常奇怪的行为
KameeCoding

7

从Gradle 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")
      }
    }
  }
}

whenPluginAdded {不必严格检查Java插件(... )来包装依赖关系块,但是它将处理将非Java项目添加到同一内部版本。

然后,在儿童gradle项目中,您可以简单地省略版本:

apply plugin: "java"

dependencies {
  implementation("com.google.guava:guava")
}

子版本仍可以选择指定更高版本。如果指定了较低的版本,它将自动升级到约束中的版本。


1
依赖约束已在Gralde 4.6中添加,因此这将在Gradle 4.6或更高版本中使用。
Jim Hurne,

我认为Gradle提供了在这种情况下使用Java平台插件的方法。但是,Gradle文档目前还不是很清楚。我想用法allprojects也很好。
JojOatXGME

我想在根项目中声明约束,但仅在我的一个子项目中声明,我想加载所有已定义约束的依赖。
dtc

2

io.spring.gradle:dependency-management-plugin插件在新的Gradle 3.x系列中存在问题,但对于2.x系列稳定。供参考,请参考错误报告 Drop对Gradle 3#115的支持。

如果是Spring(BOM使用的主要推动者),则可能以:

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-bomorg.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

您可以集中使用以下代码依赖项:

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}"
}


0

为了使gradle文件保持干净,我们可以将依赖项分组到一个数组中,并在以后实现它们。

  1. build.gradle(应用程序级别)中,在依赖关系块之外添加类似版本的库:

//声明库的版本

final RetrofitVersion = '2.3.0'
final OkHttpVersion = '3.9.1'
  1. 创建一个相关依赖项数组,以便以后可以轻松找到它。将其添加到依赖块外部的build.gradle(应用程序级别)中

//在库中使用version并添加依赖项以及访问名(例如retrofit(第一个))

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

如何包括注释处理器?就像在龙目岛的情况下
英国乔希
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.