代码之家  ›  专栏  ›  技术社区  ›  M. Justin Marwan Alsabbagh

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

  •  1
  • M. Justin Marwan Alsabbagh  · 技术社区  · 7 年前

    我正在创建一个分级任务,在其中我想下载和引用一个在Maven存储库中存在的工件的JAR文件。具体来说,我计划通过Gradle调用一个外部脚本 exec

    作为一个简单而具体的例子,假设我的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"
    

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   M. Justin Marwan Alsabbagh    7 年前

    假设我们想要的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 guava-26.0-jre . 标记为 transitive: false 工件中的任何依赖项都不会包含在配置中,也不会在本地工件缓存中存在的情况下被下载。

    configurations.myArtifact.singleFile 返回 java.io.File 引用工件的jar文件。这个 getSingleFile() 方法还确保集合中只有一个文件,并抛出 IllegalStateException

    这个 toAbsolutePath()

    注意,这是将工件复制到 the task's temporary directory 在一个 doFirst 块,而不是直接引用文件的路径。这使得在加载脚本时不需要解析工件。否则,即使在执行不相关的任务时(包括 clean tasks

    这个 StandardCopyOption.REPLACE_EXISTING 选项用于覆盖以前生成的任何以前的jar文件。