Spring依赖管理Gradle插件无法下载依赖项。

3
我是使用IntelliJ上的Spring Dependency-Management Gradle插件。我有一个根模块,其中包含以下内容:
apply plugin: "io.spring.dependency-management"

dependencyManagement {
    dependencies {
      dependencySet(group: "org.apache.hadoop", version: "2.6.0-cdh5.14.4") {
                entry "hadoop-common"
                entry "hadoop-hdfs"
            }
     }
}

如果我添加:

dependency 'org.apache.hadoop:hadoop-tools:2.6.0-mr1-cdh5.14.4' 

或者

dependencySet(group: "org.apache.hadoop", version: "2.6.0-mr1-cdh5.14.4") {
    entry ("hadoop-tools") {
        exclude group: 'ch.qos.logback', module: 'logback-classic'
        exclude group: 'org.slf4j', module: 'slf4j-log4j12'
    }
}

在根模块中,它没有下载hadoop-tools jar文件。只有当我在子模块中添加以下内容时,它才会下载此依赖项。

plugins {
    id "com.github.johnrengelman.shadow" version "2.0.4"
}

dependencies {
    compile ("org.apache.hadoop:hadoop-tools:2.6.0-mr1-cdh5.14.4") {
        exclude group: 'ch.qos.logback', module: 'logback-classic'
        exclude group: 'org.slf4j', module: 'slf4j-log4j12'
    }
}

为什么会出现这种行为?

嗨。我在我的答案中提出了一个解释,这是基于我对你当前脚本和你试图实现的理解。 - M.Ricciuti
谢谢@M.Ricciuti。这很有帮助。 - s.r
1个回答

5
为了理解这个行为,您需要了解Spring DependencyManagement插件的工作原理(请参见官方文档中的this section):
  • dependencyManagement {}块用于配置将应用于依赖项的约束条件(要使用的版本、传递依赖项的排除等),但该块不会将这些依赖项应用于您的项目,
  • 您的项目的依赖关系必须使用dependencies {}块进行配置。

在您的示例中:

首先,您需要在根项目中配置dependencyManagement块,对"hadoop-common"和"hadoop-hdfs"模块进行约束,然后您可以在"dependencyManagement"块中添加"hadoop-tools"的约束(使用"dependency"或"dependencySet"):在此阶段,您还没有明确添加任何依赖项到您的项目中,但只是配置了依赖项的约束。
==> 这就解释了为什么"hadoop-tools"依赖项没有被添加/下载到您的项目中。
然后,您使用dependencies块添加了"compile"依赖项到"hadoop-tools",这是声明依赖项的正确方式,这使得"hadoop-tools"库在您的项目中可用。
如果我理解您的要求正确,基于您在问题中提供的源代码:您可以按照以下方式配置您的项目:
根项目的脚本
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath "org.springframework.boot:spring-boot-gradle-plugin:2.0.4.RELEASE"
    }
}

// configure plugins to be applied and dependencies contraints for all subprojects
subprojects {
    apply plugin: 'java'
    apply plugin: io.spring.gradle.dependencymanagement.DependencyManagementPlugin

    dependencyManagement {
        dependencies {
            // set version for hadoop-common & hadoop-hdfs to "2.6.0-cdh5.14.4"
            dependencySet(group: "org.apache.hadoop", version: "2.6.0-cdh5.14.4") {
                entry "hadoop-common"
                entry "hadoop-hdfs"
            }
            // set version "2.6.0-mr1-cdh5.14.4" for hadoop-tool, 
            //   and exclude slf4j-log4j12 module from transitive dependencies
            dependency (group: "org.apache.hadoop" , name: "hadoop-tools", version : "2.6.0-mr1-cdh5.14.4") {
                exclude 'org.slf4j:slf4j-log4j12'
            }
        }
    }
    repositories {
        jcenter()
        maven {
            url = 'https://repository.cloudera.com/content/repositories/releases/'
        }
    }
}

子项目脚本

dependencies{

    // hadoop-tools module version is defined (constrained) 
    //   by dependencyManagement in root project build script
    compile 'org.apache.hadoop:hadoop-tools'

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接