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

时间:2017-08-15 10:52:09

标签: java gradle build.gradle gradle-task

我有一个构建管道,我想在从依赖列表中将它复制到一个单独的文件夹后运行一个特定的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是在配置阶段设置的,当时文件尚未被复制。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

当你应该在configuration阶段执行逻辑时,你会遇到在execution阶段执行逻辑的常见错误。

试试这个

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

如果是我,我会在serverPath内计算run而不是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"
}