如何在gradle子项目中使用gradle Artifactory插件

时间:2016-05-12 00:13:00

标签: gradle artifactory

我有一个多项目gradle构建,其中一个子项目正在应用Artifactory插件(版本4.2.0),并配置contextUrl并解析repoKey。

它设置一个简单的配置和依赖项,然后有一个复制任务来将依赖项检索为zip文件并将其解压缩到一个目录中。

但是,当复制任务运行时,我会收到以下错误。我究竟做错了什么?这是Artifactory插件或gradle,还是......?

的问题

问题似乎与这是否是子项目无关。如果我删除多项目配置并从子项目目录运行任务,我会收到同样的错误。

FAILURE: Build failed with an exception.

* Where:
Build file 'C:\Users\hoobajoob\project\subproject\package.gradle' line: 36

* What went wrong:
A problem occurred evaluating project ':subproject'.
> Could not resolve all dependencies for configuration ':subproject:runtimeDep'.
   > Cannot resolve external dependency company.com:artifact-id:1.0.0 because no repositories are defined.

以下是subproject / package.gradle的内容(Artifactory url / user / password属性位于子项目的gradle.properties文件中):

plugins {
  id "com.jfrog.artifactory" version "4.2.0"
}

artifactory {
    contextUrl = "${artifactory_contextUrl}"
    resolve {
        repository {
          username = "${artifactory_user}"
          password = "${artifactory_password}"
          repoKey = 'some-repo'
        }
    }
}

configurations {
    runtimeDep
}

dependencies {
    runtimeDep 'company.com:artifact-id:1.0.0@zip'
}

ext.destination = null
task getDependencies(type: Copy) {
    from zipTree { configurations.runtimeDep.singleFile }
    into ".artifacts/runtime"
}

除了包装器任务之外,根项目构建脚本是空的。以下是settings.gradle文件:

include 'subproject'
rootProject.children.each { project -> project.buildFileName = "package.gradle" }

2 个答案:

答案 0 :(得分:0)

当Gradle打印到控制台时:

您没有定义repositories{}块,因此它不知道如何下载声明的依赖项。

答案 1 :(得分:0)

虽然我的问题中的任务设置不同,但这似乎与this other SO question中描述的症状相同。

问题似乎与Artifactory插件在gradle的执行阶段之前不会执行依赖项解析的事实有关。我假设使用闭包定义zipTree任务中getDependencies步骤的参数会产生将依赖性解析推迟到该阶段的效果。

但是,为了使复制任务延迟,我需要将from任务的getDependencies配置定义为闭包,并在该闭包中包含zipTree操作

区别在于:

from zipTree { configurations.runtimeDep.singleFile } // doesn't work

...和

from { zipTree( configurations.runtimeDep.singleFile ) } // works

进行此更改可使解析工作(没有必需的maven repositories阻止)。

另一个解决方案是完全删除Artifactory配置(在这种情况下我可以做,因为我不需要使用Artifactory独有的任何东西)并使用传统的gradle repositories块,如另一个SO中所述问题和crazyjavahacking。这样做会缩短构建脚本,我可以按照原来编写的那样配置zipTree步骤:

repositories {
   maven {
      url "${artifactory_contextUrl}/repo-key"
   }
}

configurations {
    runtimeDep
}

dependencies {
    runtimeDep 'company.com:artifact-id:1.0.0@zip'
}

ext.destination = null
task getDependencies(type: Copy) {
    from zipTree { configurations.runtimeDep.singleFile }
    into ".artifacts/runtime"
}