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

时间:2016-09-10 09:28:24

标签: java gradle copy

我使用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

2 个答案:

答案 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'
    }
}