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

如何用Gradle将多个不同仓库的WAR包解压至同一目录?

解决Gradle多WAR包解压到同一目录被覆盖的问题

你的代码核心问题在于循环调用from的写法不够简洁,且Gradle默认会用后续WAR包的同名文件覆盖前面的。以下是两种更优雅的解决方案:

方案1:合并解压(同名文件保留最后一个)

直接将配置中的所有WAR包转换为zipTree集合作为Copy任务的源,无需循环:

task unpackingWar(type: Copy) {
    destinationDir = file("$buildDir/generated-resources/unpack/static")
    includes = ["**/*.jsp"] // 优化includes写法,精准匹配所有jsp文件
    includeEmptyDirs = false

    // 一次性传入所有WAR包的zipTree源
    from configurations.webWarUnpacking.files.collect { zipTree(it) }
}

这种写法让Gradle自动遍历所有WAR包的内容,解压到目标目录实现合并,逻辑更清晰,也避免了循环带来的潜在问题。

方案2:避免同名文件覆盖

如果WAR包存在同名文件且需要保留所有版本,可以通过eachFile规则给文件名添加唯一标识:

task unpackingWar(type: Copy) {
    destinationDir = file("$buildDir/generated-resources/unpack/static")
    includes = ["**/*.jsp"]
    includeEmptyDirs = false

    from configurations.webWarUnpacking.files.collect { zipTree(it) }

    // 给每个文件添加对应WAR包的标识后缀,防止同名覆盖
    eachFile { fileDetails ->
        def sourceWar = configurations.webWarUnpacking.files.find { war ->
            zipTree(war).contains(fileDetails.sourcePath)
        }
        if (sourceWar) {
            def warId = sourceWar.name.take(8) // 用WAR包名前8位作为标识,也可改用哈希值
            fileDetails.path = "${fileDetails.parent}/${fileDetails.nameWithoutExtension}_${warId}${fileDetails.extension}"
        }
    }
}

内容的提问来源于stack exchange,提问作者Lenchu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 18:37:12