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

标签 java gradle build.gradle gradle-task

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

目前我正在执行以下操作:

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"
}

但是它失败了,预期目录'...'只包含一个文件,但是,它不包含文件。因为我猜测serverPath是在文件尚未复制时的配置阶段。我该如何解决这个问题?

最佳答案

您犯了一个常见错误,即在配置阶段执行逻辑,而实际上应该在执行阶段执行逻辑。

试试这个

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

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

例如:

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"
}

关于java - Gradle - 复制任务完成后导出属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45691404/

相关文章:

java - Blob GetBinaryStream 需要关闭吗?

java - 在 Eclipse 链接中使用历史策略跟踪更改

java - android gradle如何将构建版本传递给android mk

Gradle - 找不到方法 wrapper() - 依赖项目

gradle - 通过bamboo将gradle项目部署到nexus

java - Netty:不使用证书的安全连接

java - 在当前应用程序上使用hadoop

java - Eclipse Gradle STS 扩展 : Could not reserve enough space for object heap

android - ./gradlew无法执行二进制文件:Gitlab CI/CD上的Exec格式错误

Android Studio Gradle 错误 - preDexDebug