Java 如何强制Gradle在自定义WAR任务中覆盖资源文件?
我创建了一个war任务,用src/release/resources覆盖src/main/resources:Java 如何强制Gradle在自定义WAR任务中覆盖资源文件?,java,gradle,copy,Java,Gradle,Copy,我创建了一个war任务,用src/release/resources覆盖src/main/resources: task warRelease(type: War) { webInf { from 'src/release/resources' into 'classes' } duplicatesStrategy = DuplicatesStrategy.WARN } 意外war文件中有两个database.properties $ j
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
根据,
从Gradle 0.9.1开始,复制任务始终覆盖文件。其他的
这些战略尚未得到支持
格拉德尔-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
您指定的
build.gradle
文件确实向控制台写入了一条警告消息(re:duplicates),这可能是您所怀疑的
<> >以便战争文件更喜欢<代码> SRC/Relo/资源/数据库。属性过<代码> SRC/主/资源/数据库。属性< /代码>,考虑如下:
apply plugin: 'war'
task warRelease(type: War) {
webInf {
exclude 'src/main/resources/database.properties'
from 'src/release/resources'
into 'classes'
}
}
War任务仅扩展AbstractCopy任务。该链接直接讨论了一个CopyTask。通常情况下,您可以使用API让任务排除重复文件。诀窍是,辅助文件总是被排除在外,并且您不能(我认为)为WAR任务覆盖它 默认情况下,
src/main/resources
文件始终包含在WAR任务中。我还没有找到一种方法来更改默认包含的顺序。下一个最佳选项是直接将替换的文件从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
任务将在将所有源集的资源文件包括到WAR中之前将它们复制到此位置。这将排除'src/release'而不是'src/main'这将不排除任何内容,如果它起作用,它将从'src/release/resources'中排除中的文件。