我使用src / release / resources创建一个war任务来覆盖src / main / resources:
task warRelease(type: War) {
webInf {
from 'src/release/resources'
into 'classes'
}
duplicatesStrategy = DuplicatesStrategy.WARN
}
意外,war文件中有两个database.properties
$ jar tf build/libs/project.war | grep database
WEB-INF/classes/database.properties
WEB-INF/classes/database.properties
根据this,
从Gradle 0.9.1开始,复制任务始终会覆盖文件。另一个 策略尚不支持。
gradle -v
Gradle 2.14.1
------------------------------------------------------------
Build time: 2016-07-18 06:38:37 UTC
Revision: d9e2113d9fb05a5caabba61798bdb8dfdca83719
Groovy: 2.4.4
Ant: Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM: 1.8.0_102 (Oracle Corporation 25.102-b14)
OS: Linux 4.7.2-1-ARCH amd64
答案 0 :(得分:1)
War任务只扩展了AbstractCopy任务。链接直接谈论CopyTask。您通常使用setDuplicatesStrategy API让任务排除重复文件。诀窍是辅助文件总是被排除在外,你不能覆盖它(我认为)用于WAR任务。
WAR任务中默认包含src/main/resources
个文件。我还没有找到改变默认包含顺序的方法。下一个最佳选择是直接从WAR中排除替换的文件:
task warRelease(type: War) {
classifier 'release'
webInf {
from 'src/main/release'
into 'classes/'
}
rootSpec.filesMatching(/database.properties/) { details ->
if (details.file.path =~ "build/resources/main/"){
details.exclude()
}
}
}
您可能想知道为什么排除的文件来自路径build/resources/main/
。这是因为processResources
任务将复制所有的sourceSets'资源文件在包含在WAR之前到此位置。
答案 1 :(得分:0)
您指定的build.gradle
文件确实会将一条WARN消息(re:duplicates)写入控制台,如人们所怀疑的那样。
为了让WAR文件更喜欢src/release/resources/database.properties
而不是src/main/resources/database.properties
,请考虑以下事项:
apply plugin: 'war'
task warRelease(type: War) {
webInf {
exclude 'src/main/resources/database.properties'
from 'src/release/resources'
into 'classes'
}
}