Gradle自定义任务修复:执行阶段手动运行解压任务失效问题排查
问题原因
- 第一处是拼写错误:你声明的配置变量名为
nativesOS,但在dependencies闭包里写的是nativeOS,少了末尾的s,导致你声明的配置压根没有引入任何依赖,执行时自然找不到要解压的jar包。 - 第二处是Configuration解析时机错误:你在配置阶段就调用了
nativesOS.asFileTree.filter { it.name.contains("natives") }.files直接解析配置文件,配置阶段依赖还未完成下载/解析,大概率会拿到空集合,而且还会拖慢全局配置速度。 - 第三处是任务类型使用不当:你声明了
Copy类型的任务,但完全没有用到Copy任务的增量更新、路径自动处理等能力,反而在doFirst里自己实现解压逻辑,属于没必要的冗余实现,还容易出路径异常。
修复后代码(推荐写法,支持增量更新)
val nativesOS : Configuration by configurations.creating { isTransitive = false extendsFrom(configurations.runtimeOnly.get()) } dependencies { implementation(platform("org.lwjgl:lwjgl-bom:3.2.3")) // 修正拼写错误,和上面声明的配置名保持一致 nativesOS("org.lwjgl","lwjgl", "3.2.3", classifier = "natives-windows") // 其余依赖保持不变 ... } tasks.register<Copy>("unzip_native_os") { group = "zip" // 解压目标目录,Copy任务自动创建 destinationDir = file("$buildDir/libs/natives-os") // 配置阶段只声明输入来源,执行阶段才会真正解析依赖、执行解压 nativesOS.filter { it.name.contains("natives") }.forEach { jarFile -> from(zipTree(jarFile)) } }
保留原有doFirst写法的修复方案
如果你一定要保留原有doFirst的写法,只需要把配置解析逻辑挪到执行阶段即可:
tasks.register<Copy>("unzip_native_os") { group = "zip" doFirst { // 把解析逻辑挪到执行阶段,此时依赖已经完成解析 val nativesJar = nativesOS.asFileTree.filter { it.name.contains("natives") }.files nativesJar.forEach { println(">>>> $it") unzipTo(File("$buildDir/libs/natives-os"), it) } } }
内容的提问来源于stack exchange,提问作者Liveon Phoenix
相关产品推荐
相关产品推荐

