You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 03:36:04