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

如何在Gradle中下载和引用单个工件?,gradle,dependency-management,dependency-resolution,Gradle,Dependency Management,Dependency Resolution,我正在创建一个Gradle任务,在该任务中,我希望下载并引用Maven存储库中存在的工件的jar文件。具体来说,我计划通过Gradle任务调用一个外部脚本,使用jar的位置作为脚本的参数。使用exec任务很简单;我想弄清楚的是如何获取工件的jar文件在文件系统上的位置 作为一个简单但具体的示例,假设我的Gradle项目目录中有以下文件: build.gradle: task myScript(type: Exec) { executable './my_script.sh' ar

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

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

build.gradle:

task myScript(type: Exec) {
    executable './my_script.sh'
    args jarFilePath // How do I get this value?
}
#!/usr/bin/env bash
echo "Jar file location: $1"
我的脚本。sh:

task myScript(type: Exec) {
    executable './my_script.sh'
    args jarFilePath // How do I get this value?
}
#!/usr/bin/env bash
echo "Jar file location: $1"

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

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

导入java.nio.file.Files
导入java.nio.file.Path
导入java.nio.file.StandardCopyOption
存储库{
mavenCentral()
}
配置{
我的神器
}
依赖关系{
MyArtifactGroup:'com.google.guava',名称:'guava',
版本:“26.0-jre”,可传递:false
}
任务myScript(类型:Exec){
路径工件路径=
temporaryDir.toPath().resolve('guava.jar').toabsolutionPath()
首先{
Files.copy(configurations.myArtifact.singleFile.toPath(),artifactPath,
StandardCopyOption。替换(现有)
}
可执行文件“./my\u script.sh”
args artifactPath.toString()
}
这将创建一个名为“myArtifact”的自定义项目,该项目只依赖于
guava-26.0-jre
。通过将其标记为
transitive:false
配置中不会包含任何工件的依赖项,如果它们还不存在于本地工件缓存中,也不会下载它们

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

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

请注意,这是将工件复制到块中,而不是直接引用文件的路径。这是为了在加载脚本时不需要解析工件。否则,即使在执行不相关的任务(包括
clean
tasks
等基本任务)时,也需要解析(并可能下载)工件,如果无法解析工件,则会导致生成失败


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

以下带有复制任务的片段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"
}