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

如何在gradle子项目中使用gradle Artifactory插件,gradle,artifactory,Gradle,Artifactory,我有一个多项目的gradle构建,其中一个子项目正在应用Artifactory插件(版本4.2.0),并配置contextUrl和resolve repoKey 它设置了一个简单的配置和依赖项条目,然后有一个复制任务以将依赖项作为zip文件检索并将其解压缩到目录中 FAILURE: Build failed with an exception. * Where: Build file 'C:\Users\hoobajoob\project\subproject\package.gradle'

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

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

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.
但是,当复制任务运行时,我得到以下错误。我做错了什么?这是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的内容(artifactoryurl/user/password属性位于subproject的gradle.properties文件中):

除包装器任务外,根项目生成脚本为空。下面是settings.gradle文件:

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

当渐变打印到控制台时:


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

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

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

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

这是两者之间的区别:

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

from { zipTree( configurations.runtimeDep.singleFile ) } // works
进行此更改可以使解析生效(不需要maven
repositories
block)

另一个解决方案是完全删除Artifactory配置(在本例中我可以这样做,因为我不需要使用Artifactory特有的任何东西),并使用传统的gradle
存储库
块,如其他SO问题和中所述。这样做可以缩短构建脚本,并且我可以让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"
}

这应该是Artifactory插件的责任。据文件记载,它可以提供对解析和发布的支持,而不需要存储库块。见: