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