Я перевожу сборку Maven WAR в Gradle. Как заставить блок фильтров вести себя таким же образом? - PullRequest
0 голосов
/ 14 февраля 2020

Я конвертирую сборку из 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.

Документация для Копирование задач с фильтром в них не настолько полны и не описывают, какие конкретно c проблемы (ы) я пытаюсь решить:

  • Фильтрация указанных c файлов ресурсов
  • Поддержание стиля переменных POM в использовании (${example.property})
  • Обеспечение попадания артефакта в мою WAR

Как мне go поступить это?

1 Ответ

0 голосов
/ 14 февраля 2020

Это расширение этого Gradle-ориентированного ответа с некоторыми более конкретными примерами.

Во-первых, нам нужно прочитать все ресурсы, которые нас интересуют, во что-то, что filter метод задачи копирования будет распознавать. Условно это был просто стандартный Properties объект.

Это можно сделать так:

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

Обратите внимание, что может быть более элегантный способ получить более одного свойства подать сразу; у меня этот подход просто сработал для одного файла.

Затем нам нужно выполнить фильтрацию. Это может быть достигнуто с закрытием from. Для этого мы используем ReplaceTokens class (который мы можем импортировать) и настраиваем начальный и конечный токены, чтобы они соответствовали нашему использованию переменной.

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 ресурсы, которые вы хотите отфильтровать, будут правильно отфильтрованы в архиве.

...