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

贾斯汀

我正在创建一个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"

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

贾斯汀

假设我们想要的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()
}

这将创建一个名为“ myArtifact”的自定义配置,配置仅依赖于guava-26.0-jre通过将其标记为配置中transitive: false没有任何工件依赖项,如果本地工件缓存中还不存在依赖项,则也不会下载它们。

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

所述toAbsolutePath()不需要方法确保路径的脚本是绝对的,并因此相对于任何特定的目录有待解决。

请注意,这是将工件复制到doFirst块中的任务的临时目录,而不是直接引用文件的路径。这样一来,加载脚本时无需解析工件。否则,神器就需要做不相关的任务,即使得到解决(也可能是下载) -包括这样的基本任务-导致构建失败,如果神器无法解析。cleantasks

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章