【问题标题】:Replace a resource file in a WAR file in Gradle 3.5在 Gradle 3.5 中替换 WAR 文件中的资源文件
【发布时间】:2017-07-13 04:37:19
【问题描述】:

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

我在下面有 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 模式运行应用程序,无需构建战争文件。在这种情况下,文件resources/cluster.xml 是从类路径中挑选出来的,应用程序就像魅力一样工作。

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

【问题讨论】:

    标签: gradle war


    【解决方案1】:

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

    【讨论】:

    • 我应该把processResources 放在war 里面吗?
    • @injecteer 不,它应该在war { } 之外。这配置了processResources 任务,有关它的更多信息在这里:docs.gradle.org/current/userguide/…
    • @injecteer 试试我更新的答案。它只会在文件被复制时修改 WAR 的内容。
    • 将尝试一下。你能简单解释一下rootSpec是什么意思吗?
    • @injecteer 当然。 war 任务是一个Copy 任务,它包含一个或多个CopySpecs,每个CopySpecs 彼此完全隔离。 rootSpec 是 Gradle 中可以更改现有 CopySpecs 行为的方式。
    【解决方案2】:

    试试这个:

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

    【讨论】:

    • 这会将cluster.xml 从所有任务中排除,这是我最不想做的事情
    【解决方案3】:

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

    例如

    - 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 添加到一起。恕我直言,这比使用排除要好得多

    【讨论】:

    • 我相信您的建议是添加两个名为 ab 的额外 SourceSet。
    • 我想这取决于用例(您何时/何地需要a 资源与b 资源)。您不一定需要添加SourceSets 来使用src/x/resources 约定,因为涉及到开销(编译任务等)。谁知道呢,你可能会去“整头猪”,用我的java-flavours插件
    • 没错,您的建议似乎符合各个 SourceSet 的约定。
    • 确实,约定是一个强大的东西。如果我在src/main 目录下看到“a”和“b”文件夹,我会怀疑这些是特定于风味/变体的文件,甚至没有看到构建文件。另一方面,src/main/resources/a/cluster.xml 令人困惑
    • 如果只是资源,我可能会选择不使用额外的SourceSets。将来,如果每个风味/变体有额外的 .java 文件,它可以轻松更改为 SourceSets 而无需更改目录结构
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多