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

时间:2017-07-12 13:51:52

标签: gradle war

我扫描了整个互联网并找到了很多答案,但都没有对我有效。

我有

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

在我的战争文件中,我希望拥有后者。

所以我试过了:

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任务bootRun,它以development模式运行应用程序,无需构建war文件。在这种情况下,文件resources/cluster.xml从类路径中选取,应用程序就像魅力一样。

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

3 个答案:

答案 0 :(得分:2)

试试这个:

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

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

答案 1 :(得分:2)

要仅修改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"
       }
    }
}

答案 2 :(得分:1)

您考虑过将多个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加在一起。恕我直言,这比使用排除

要好得多