【问题标题】:How to download dependencies in gradle如何在 gradle 中下载依赖项
【发布时间】:2014-03-15 21:32:13
【问题描述】:

我有一个自定义编译任务。

task compileSpeedTest(type: JavaCompile) {
    classpath = files('build')
    source = fileTree('src/test/java/speed')
    destinationDir = file('bin')
}

Gradle 在执行之前不会尝试下载依赖项。 我在任何地方都找不到将其添加到列表dependsOn 的任务名称。

【问题讨论】:

  • 你指的是什么依赖?您的构建脚本没有定义任何依赖项。请添加相关代码,以便我们可以连接点。

标签: gradle


【解决方案1】:

没有下载依赖的任务;它们是按需下载的。要了解如何使用 Gradle 管理依赖项,请参阅 Gradle User Guide 中的“第 8 章。依赖项管理基础知识”。

【讨论】:

  • 他们说 gradle 像蚂蚁一样灵活。
  • 我做到了。我阅读了“超越基础的 Gradle”和“使用 Gradle 构建和测试”。但它们并没有太大帮助,因为我无法触发下载依赖项的基本操作。许多页面专门讨论超级对象任务图,一切都是任务。并且没有任何语句检索依赖项不是任务。
  • 我不同意反对票。这个问题很明显。我有一个 Gradle 任务。我提供了。我寻找另一个任务将它添加到它的依赖列表中。
  • 我想问题很简单:如何确保对于依赖于依赖项(doh)的任务,真正首先检索依赖项。在我的情况下,我需要对检索到的工件进行一些后处理(将 ZIPped 工件解压缩到工作树),但我的 unzipDepenencies 任务的简单 dependsOn: configurations.compile 似乎并不能解决问题。如果我只是调用该任务,则如果它们不存在,则不会首先检索依赖项。换种说法:Gradle 如何知道何时需要依赖项?
  • Here's some interesting read 关于为什么依赖 configurations.compile 会/不起作用。
【解决方案2】:

很难从问题中确切地弄清楚您要做什么。我猜测一下,除了 java 插件提供的开箱即用的任务之外,您还想添加一个额外的编译任务。

最简单的方法可能是指定一个名为“speedTest”的新sourceSet。这将生成一个名为“speedTest”的configuration,您可以使用它在dependencies 块中指定您的依赖项。它还会为您生成一个名为compileSpeedTestJava 的任务。

例如,看看Java plugin documentation中的defining new source sets

总的来说,您似乎对依赖管理如何与 Gradle 一起工作有一些不正确的假设。我会回应其他人的建议,再次阅读用户指南的“依赖管理”章节:)

【讨论】:

    【解决方案3】:

    如果您确实需要将 java 依赖项下载到文件夹中,则可以下载它们。

    例子:

    apply plugin: 'java'
    
    dependencies {
      runtime group: 'com.netflix.exhibitor', name: 'exhibitor-standalone', version: '1.5.2'
      runtime group: 'org.apache.zookeeper',  name: 'zookeeper', version: '3.4.6'
    }
    
    repositories { mavenCentral() }
    
    task getDeps(type: Copy) {
      from sourceSets.main.runtimeClasspath
      into 'runtime/'
    }
    

    执行gradle getDeps时,将依赖项(及其依赖项)下载到文件夹runtime

    【讨论】:

    【解决方案4】:

    你应该试试这个:

    task getDeps(type: Copy) {
        from configurations.runtime
        into 'runtime/'
    }
    

    前段时间我在一个项目中寻找它,在这个项目中,我们必须在我们的配置脚本中的某个时间点将所有依赖项下载到当前工作目录中。我猜你正在尝试实现类似的目标。

    【讨论】:

      【解决方案5】:

      一个稍微轻松的任务,不需要将文件复制到目录:

      task downloadDependencies(type: Exec) {
          configurations.testRuntime.files
          commandLine 'echo', 'Downloaded all dependencies'
      }
      

      针对 kotlin 和 gradle 6.2.0 进行了更新,添加了 buildscript 依赖解析:

      fun Configuration.isDeprecated() = this is DeprecatableConfiguration && resolutionAlternatives != null
      
      fun ConfigurationContainer.resolveAll() = this
        .filter { it.isCanBeResolved && !it.isDeprecated() }
        .forEach { it.resolve() }
      
      tasks.register("downloadDependencies") {
        doLast {
          configurations.resolveAll()
          buildscript.configurations.resolveAll()
        }
      }
      

      【讨论】:

      • 我的理解是 Configuration.files 返回一个延迟评估的 File 对象集合,指向本地 .gradle 缓存中的依赖项。如果您引用它,则必须检查它们是否都存在,如果不存在,请下载它们。
      • 如果您只是对缓存依赖项感兴趣,这是完美的选择。
      • 如果您只使用它来缓存来自存储库的依赖项,那么这有一个额外的好处,即不需要生成来自上游配置的工件。这在多项目构建中尤其重要,其中inputsdependsOn 指令(包括from 用于Copy 任务)将强制Gradle 构建所有上游工件。当您只想下载 依赖项(无需准备上游工件)时,这是一个完美的解决方案。谢谢你。
      【解决方案6】:

      这个版本建立在 Robert Elliot 的基础上,但我不能 100% 确定它的功效。

      // There are a few dependencies added by one of the Scala plugins that this cannot reach.
      task downloadDependencies {
        description "Pre-downloads *most* dependencies"
        doLast {
          configurations.getAsMap().each { name, config ->
            println "Retrieving dependencies for $name"
            try {
              config.files
            } catch (e) {
              project.logger.info e.message // some cannot be resolved, silentlyish skip them
            }
          }
        }
      }
      

      我尝试将其放入配置而不是操作(通过删除 doLast),但它破坏了锌。我解决了它,但无论有没有最终结果都是一样的。所以,我把它作为一个明确的状态。它似乎足以减少稍后必须下载的依赖项,但在我的情况下并不能消除它们。我认为其中一个 Scala 插件稍后会添加依赖项。

      【讨论】:

      • 在 Gradle 2.13 上为我工作...对于 Dockerfized 构建需要这个...谢谢!
      【解决方案7】:

      对于 Intellij,请转到视图 > 工具窗口 > Gradle > 刷新所有项目(Gradle 窗口顶部的蓝色圆形箭头。

      【讨论】:

      • 我花了很长时间才弄清楚这一点。我发现“刷新”这个词非常违反直觉。它并不表示它会下载新的依赖项。 Maven 的“安装”更加清晰,恕我直言。
      • 似乎是 IDE 集成问题。对我来说,刷新失败,Caused by: java.lang.NoClassDefFoundError: org/gradle/api/internal/plugins/DefaultConvention。 Gitlab 上的 Gradle 用户 github.com/gradle/gradle/issues/11769 说 Intellij 必须有实际版本才能使其工作
      【解决方案8】:

      我发现这个答案https://stackoverflow.com/a/47107135/3067148 也很有帮助:

      gradle dependencies 将列出依赖项并将它们下载为 副作用。

      【讨论】:

      • 它似乎只下载元信息(pom)而不是实际的jar文件(用Gradle 6测试)。
      • 根本不包括单元测试依赖项,只是元信息。
      【解决方案9】:

      我认为 Gradle 没有特定的 task 来下载依赖项。但是,必须以某种方式下载依赖项。否则无法编译工程。

      我注意到,当您运行 compile 任务时,Gradle 也会下载依赖项。

      因此,最接近下载依赖项的taskcompile 任务。如compileKotlincompileJava

      【讨论】:

        猜你喜欢
        • 2023-03-15
        • 1970-01-01
        • 2015-03-20
        • 2012-09-24
        • 1970-01-01
        • 2018-06-19
        • 2012-11-13
        • 2023-04-08
        • 2016-11-23
        相关资源
        最近更新 更多