首页 > 解决方案 > 我正在将 Maven WAR 构建迁移到 Gradle。如何让过滤器块以相同的方式运行?

问题描述

我正在将构建从 Maven 转换为 Gradle,并在其中进行一些资源过滤。具体来说,我们有一个如下所示的块:

<build>
    <finalName>${project.name}-${project.version}</finalName>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
    <testResources>
      <testResource>
        <directory>src/test/resources</directory>
        <filtering>true</filtering>
      </testResource>
    </testResources>
    <filters>
        <filter>/path/to/more/resources.properties</filter>
        <filter>/path/to/more/resources.properties</filter>
        <filter>/path/to/more/resources.properties</filter>
    </filters>
</build>

...我们希望在 Gradle 中获得类似的东西。

带有过滤器的复制任务的文档并不完整,也没有描述我正在尝试解决的具体问题:

我该怎么做呢?

标签: mavengradlewar

解决方案


这是这个面向 Gradle 的答案的扩展,带有一些更具体的示例。

首先,我们需要将我们关心的所有资源读入filterCopy 任务的方法将识别的内容。按照惯例,这只是一个标准Properties对象。

这可以像这样完成:

def resources = new Properties()
file($projectDir/src/main/resources/<insert-properties-file>.properties").withInputStream {
    resources.load(it)
}

请注意,可能有一种更优雅的方法可以一次获取多个属性文件;这种方法对我来说只适用于单个文件。

接下来,我们需要实际进行过滤。这可以通过from关闭来实现。我们利用ReplaceTokens 类(我们可以导入)来执行此操作,并配置开始和结束标记以匹配我们的变量使用。

from("$projectDir/path/to/folder/that/has/tokens/to/replace") {
    include "**/files-to-filter-on"
    filter(ReplaceTokens, tokens: resources, beginToken: "${", endToken: "}")
}

要将其放入 WAR,我们需要将其加载到processResources任务中。

全部一起:

processResources {
    with copySpec {
        def resources = new Properties()
        file($projectDir/src/main/resources/<insert-properties-file>.properties").withInputStream {
        resources.load(it)
    }

    from("$projectDir/path/to/folder/that/has/tokens/to/replace") {
        include "**/files-to-filter-on"
        filter(ReplaceTokens, tokens: resources, beginToken: "${", endToken: "}")
    }
}

当您执行./gradlew clean war时,您想要过滤的资源将在存档中正确过滤。


推荐阅读