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,为其他所有任务更改它吗?
答案 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'
}
}