如何在Gradle中下载和引用单个工件?

时间:2018-08-10 22:22:49

标签: gradle dependency-management dependency-resolution

我正在创建一个Gradle任务,我想在其中下载并引用jar文件中Maven存储库中存在的工件。具体来说,我计划使用该jar的位置作为脚本的参数,通过Gradle exec任务调用外部脚本。使用exec任务很简单;我要弄清楚的是如何获取工件的jar文件在文件系统上的位置。

作为一个简单而具体的示例,假设我在Gradle项目目录中有以下文件:

build.gradle:

task myScript(type: Exec) {
    executable './my_script.sh'
    args jarFilePath // How do I get this value?
}

my_script.sh:

#!/usr/bin/env bash
echo "Jar file location: $1"

如何获取工件容器的文件路径,如有必要,如何从远程存储库下载文件路径?例如,如果它不在我的本地工件缓存中,或者它是更新的快照版本,则应该下载。

2 个答案:

答案 0 :(得分:1)

让我们假设我们想要的jar文件是guava-26.0-jre.jar。以下build.gradle文件将检索工件(如有必要)并提供文件位置作为脚本的参数:

import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.StandardCopyOption

repositories {
    mavenCentral()
}

configurations {
    myArtifact
}

dependencies {
    myArtifact group: 'com.google.guava', name: 'guava', version: '26.0-jre', transitive: false
}

task myScript(type: Exec) {
    Path artifactPath = temporaryDir.toPath().resolve('guava.jar').toAbsolutePath()

    doFirst {
        Files.copy(configurations.myArtifact.singleFile.toPath(), artifactPath, StandardCopyOption.REPLACE_EXISTING)
    }

    executable './my_script.sh'
    args artifactPath.toString()
}

这将创建一个自定义configuration,其名称为“ myArtifact”,并且对guava-26.0-jre具有单一依赖性。通过将其标记为transitive: false,不会在配置中包含任何工件的依赖项,如果本地工件缓存中尚不存在依赖项,则也不会下载依赖项。

configurations.myArtifact.singleFile的调用返回对工件的jar文件的java.io.File引用。此getSingleFile()方法还确保集合中只有一个文件,如果存在零个或多个,则抛出一个IllegalStateException。如果将来配置错误地将配置错误地配置为具有多个工件(例如,如果有人删除了“瞬态”选项),这可以防止我们引用错误的工件。

toAbsolutePath()方法可确保脚本的路径是绝对路径,因此不需要相对于任何特定目录进行解析。

请注意,这是在the task's temporary directory块中将工件复制到doFirst,而不是直接引用文件的路径。这样一来,加载脚本时无需解析工件。否则,即使在执行不相关的任务(包括诸如cleantasks之类的基本任务时,也需要解决(可能下载了)工件,如果无法解决工件,则会导致构建失败。< / p>

StandardCopyOption.REPLACE_EXISTING选项用于覆盖以前版本中的任何以前的jar文件。

答案 1 :(得分:1)

以下带有复制任务 copyDependencies 的代码片段适用于单个和多个依赖项。您可以定义与此任务相关的任何其他任务(例如,键入Exec)。

configurations {
    web {
        transitive = false
    }
}

dependencies {
    web "com.foo:foo-messaging:$version:@war",
            "com.foo:foo-ng:$version:@war"
}

task copyDependencies(type: Copy) {
    from configurations.web
    into "$buildDir/web"
}