如何用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
相关产品推荐
相关产品推荐

