Gradle任务会弄乱运行时依赖关系

Gradle任务会弄乱运行时依赖关系,gradle,groovy,Gradle,Groovy,格拉德尔的另一个奇怪行为 所以我找到了这篇帖子: 非常好,就像一个魔咒,可以防止复制 但这里是它变得有趣的地方。以下是我的复制任务的外观: task copyDependencies(type: Copy) { into "$buildDir/libs/dependencies" from configurations.runtime { exclude module: 'groovy' exclude module: 'aws-java-sdk

格拉德尔的另一个奇怪行为

所以我找到了这篇帖子:

非常好,就像一个魔咒,可以防止复制

但这里是它变得有趣的地方。以下是我的复制任务的外观:

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,然后为每一个其他任务更改它

在您的
from
配置块中,您引用的是
运行时
配置,但同时通过添加一些排除规则来更改此配置。正如您所猜测的,这将改变构建项目中所有其他任务将使用的原始(且唯一的)
运行时
配置。这解释了在尝试执行
运行
任务时出现的“无法找到或加载主类xxx”错误,因为
运行时
配置(类路径)不包含所需的库

如果要在
copyDependencies
任务中按组和/或模块编写排除规则,一种可能的方法是使用原始
运行时
配置的副本;您可以为此定义一个新配置:

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

我试图在我的回答中解释这种行为,让我知道是否足够清楚。接受它。虽然我现在使用另一种方法将应用程序与其依赖项分开,但它仍然有效。知道这些似乎是静态声明并在单个任务之间共享仍然很好。