Java 如何强制Gradle在自定义WAR任务中覆盖资源文件?

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

我创建了一个war任务,用src/release/resources覆盖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
根据,

从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'中排除
中的文件。