You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动