Gradle从2.10升级到4.6后makeWarTask停止复制资源至WEB-INF
Gradle 4.6中War任务WEB-INF复制失效问题排查
你遇到的这个问题确实是Gradle版本升级带来的API行为变化导致的,我来帮你拆解原因和解决方案:
核心原因:War插件webInf配置逻辑的版本差异
在Gradle 2.x版本中,webInf块内的from+into写法可以直接生效,但从Gradle 3.x开始,War插件对webInf的配置结构做了调整,旧的嵌套写法不再被正确解析,导致复制操作被忽略。
另外,Gradle 4.x对任务的输入输出增量构建逻辑做了强化,如果你的源文件没有发生变更,Gradle会判定任务已是最新状态,直接跳过执行——你可以先尝试执行./gradlew clean makeWarTask验证是否是这个原因。
修正后的任务代码
下面是适配Gradle 4.6的正确写法,两种方式供你选择:
方式1:修正webInf配置语法
task makeWarTask(type: War) { webInf { // 将base.xml复制到WEB-INF/classes/ from('build/resources/slave') { include 'base.xml' into 'classes' // 无需加前缀斜杠,Gradle会自动映射到WEB-INF下 } // 将DBConstant.class复制到WEB-INF/classes/com/test/util/ from('build/classes/slave/com/test/util') { include 'DBConstant.class' into 'classes/com/test/util' } } }
方式2:利用SourceSet简化配置(更推荐)
如果slave是你的自定义源码集,推荐直接关联到War任务的classpath,符合Gradle"约定大于配置"的原则,也避免手动路径维护:
// 先定义slave源码集 sourceSets { slave { java { srcDir 'src/slave/java' } resources { srcDir 'src/slave/resources' } } } // 关联到War任务 task makeWarTask(type: War) { classpath sourceSets.slave.output }
这样War任务会自动把slave源码集编译后的class文件和资源文件打包到WEB-INF/classes目录下,无需手动编写复制规则。
内容的提问来源于stack exchange,提问作者rajesh




