【问题标题】:How do you force Gradle to overwrite a resource file in a custom WAR task?如何强制 Gradle 覆盖自定义 WAR 任务中的资源文件?
【发布时间】:2017-01-18 09:01:48
【问题描述】:

我创建了一个战争任务,用 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

根据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

【问题讨论】:

    标签: java gradle copy


    【解决方案1】:

    War 任务仅扩展了 AbstractCopy 任务。该链接直接谈论 CopyTask。您通常使用setDuplicatesStrategy 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 任务会在将所有 sourceSet 的资源文件包含到 WAR 之前将它们复制到此位置。

    【讨论】:

    • 这将排除 'src/release' 而不是 'src/main'
    【解决方案2】:

    您指定的build.gradle 文件确实向控制台写入了一条警告消息(回复:重复),正如人们所怀疑的那样。

    为了使 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'
        }
    }
    

    【讨论】:

    • 这不排除任何内容,如果有效,它将排除from 'src/release/resources'中的文件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 2016-02-12
    • 1970-01-01
    相关资源
    最近更新 更多