渐变任务与运行时依赖项混淆



gradle的另一个奇怪行为。。。

所以我找到了这个帖子:复制任务的渐变排除模块

完全好,工作起来像一种魅力,将东西从复制中排除。

但这就是它变得有趣的地方。这就是我的复制任务的样子:

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配置块中,您正在引用runtime配置,但同时您正在通过添加一些排除规则来更改此配置。这将更改原始(并且是唯一的(runtime配置,该配置将由您的构建项目中的所有其他任务使用,正如您所猜测的那样。这解释了在尝试执行run任务时出现的"无法找到或加载Main Class xxx">错误,因为runtime配置(类路径(不包含所需的库。

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

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

最新更新