Gradle Task与运行时依赖关系一团糟

时间:2018-10-29 17:50:09

标签: gradle groovy

gradle的另一种奇怪行为...

所以我发现了这篇文章: Gradle exclude module for Copy task

完全没问题,就像一种魅力,可以将事物从复制中排除。

但这是有趣的地方。这是我的复制任务的外观:

task copyDependencies(type: Copy) {
    into "$buildDir/libs/dependencies"
    from configurations.runtime {
        exclude module: 'groovy'
        exclude module: 'aws-java-sdk-s3'
        exclude module: 'commons-io'
    }
}

如果我尝试通过Gradles的“应用程序运行”任务运行应用程序。它失败,并显示“找不到或加载主类xxx” 。深入研究这个问题,我发现Groovy无法解决。

我什至没有运行或依赖于此任务。 但是,如果我这样注释掉第4行:

task copyDependencies(type: Copy) {
    into "$buildDir/libs/dependencies"
    from configurations.runtime {
        //exclude module: 'groovy'
        exclude module: 'aws-java-sdk-s3'
        exclude module: 'commons-io'
    }
}

应用程序正常启动,直到达到需要Commons-IO的地步。我仍然想在其他时间使用这个copyDependencies任务,但不要在那里更改代码。

有人可以向我解释这种行为吗?

我想像一下在gradle文件中的任何地方操纵configuration.runtime,为其他所有任务更改它吗?

1 个答案:

答案 0 :(得分:2)

from配置块中,您引用的是runtime配置,但是与此同时,您通过添加一些排除规则来更改此配置。如您所料,这将更改原始(和唯一的)runtime配置,该配置将由构建项目中的所有其他任务使用。这说明了在尝试执行run任务时遇到的“找不到或加载主类xxx” 错误,因为runtime配置(类路径)没有包含所需的库。

如果您要在copyDependencies任务中按组和/或模块编写排除规则,则一种可能的方法是处理以下项目的副本原始runtime配置;您可以为此目的定义一个新的 Configuration

configurations{
    runtimeDeps.extendsFrom runtime
}

task copyDependencies(type: Copy) {
    into "$buildDir/libs/dependencies"
    from configurations.runtimeDeps {
        exclude module: 'groovy'
        exclude module: 'aws-java-sdk-s3'
        exclude module: 'commons-io'
    }
}