Gradle - 复制任务完成后导出 属性

Gradle - export property after copy task finishes

我有一个构建管道,我想在其中 运行 一个特定的 jar(带有一些 args),然后将其从依赖项列表复制到一个单独的文件夹中。

目前我正在做以下事情:

task copyToLib(type: Copy, dependsOn: classes) {
    into "$buildDir/server"
    from(configurations.compile) {
        include "webapp-runner*"
    }
    ext.serverPath =  fileTree("$buildDir/server/").include("webapp-runner-*.jar").getSingleFile()
}

task run(type: Exec, dependsOn: [copyToLib, war]) {
    mustRunAfter copyToLib
    executable 'java'
    args '-jar', copyToLib.serverPath, war.archivePath, '--port', "$port"
}

但它失败并显示 Expected directory '...' to contain exactly one file, however, it contains no files.,因为我猜测 serverPath 是在文件尚未复制的配置阶段设置的。我该如何解决这个问题?

您犯了一个常见错误,即在 configuration 阶段执行逻辑,而您应该在 execution 阶段执行逻辑。

试试这个

task copyToLib(type: Copy, dependsOn: classes) {
    ...
    doLast {
        ext.serverPath = ...
    }
}

如果是我,我会在 run 中计算 serverPath,而不是在 copyToLib 中计算。也许您可以使用 closure 来延迟计算。

例如:

task run(type: Exec, dependsOn: [copyToLib, war]) {
    def pathClosure = {
        fileTree("$buildDir/server/").include("webapp-runner-*.jar").singleFile
    }
    mustRunAfter copyToLib
    executable 'java'
    args '-jar', pathClosure, war.archivePath, '--port', "$port"
}