在 Gradle 3.5 中替换 WAR 文件中的资源文件

Replace a resource file in a WAR file in Gradle 3.5

我浏览了整个互联网并找到了很多答案,但没有一个适合我。

我有

下的2个文件
src/main/resources/
                  cluster.xml
                  a/
                    cluster.xml

在我的 war 文件中我想要后者。

所以我尝试了:

war {
  from( 'src/main/resources' ){
    exclude 'cluster.xml'
    include 'a/cluster.xml'
    into 'WEB-INF/classes'
  }
}

并将 a/cluster.xml 的 2 个副本放入 WEB-INF/classes/a 并将单个 cluster.xml 放入 WEB-INF/classes

我也试过使用 webInf{} 也没有成功。

更新:

说清楚一点。我有一个 Grails 3.x / Springboot 应用程序。它有默认的 gradle 任务 bootRundevelopment 模式运行应用程序 w/o 构建 war 文件。在这种情况下,文件 resources/cluster.xml 是从类路径中挑选出来的,应用程序就像魅力一样。

对于 war 任务,我想替换这个单个文件,而不破坏 bootRun 任务并使整个配置尽可能简单。

试试这个:

sourceSets.main.resources.exclude '**/cluster.xml'

war {
  from( 'src/main/resources' ){
    exclude 'cluster.xml'
    include 'a/cluster.xml'
    into 'WEB-INF/classes'
  }
}

要仅修改 WAR,您需要访问 rootSpec 并对 cluster.xml 文件执行一些逻辑。

war {
    rootSpec.includeEmptyDirs = false
    rootSpec.filesMatching('**/cluster.xml') { details ->
       if (details.sourcePath == "cluster.xml") {
           details.exclude()
       }
       if (details.sourcePath == "a/cluster.xml") {
           details.path = "WEB-INF/classes/cluster.xml"
       }
    }
}

与其依赖可能令人困惑的 exclude,您是否考虑过将多个 FileTrees 组合在一起?我更喜欢将两个根加在一起,而不是在一个根内进行黑客排除和移动

例如

- src/main/resources - Common stuff goes here
- src/a/resources/cluster.xml - Version A of cluster.xml
- src/b/resources/cluster.xml - Version B of cluster.xml

一旦你分成不同的目录,你就可以把你在给定情况下需要的 FileTrees 加在一起。恕我直言,这比使用 exclude

要好得多