Статьи

Фильтрация ресурсов с Gradle

Моя команда недавно запустила новый проект веб-приложения на Java, и мы выбрали  gradle в  качестве инструмента для сборки. Большинство из нас были чрезвычайно знакомы с  Maven , но решили попробовать Gradle.
Сегодня я должен был выяснить, как сделать фильтрацию ресурсов в Gradle. И, честно говоря, это было не так  просто,  как я думал, что должно быть; как минимум исходя из мавенского фона. В конце концов я понял это, но хотел опубликовать свое решение, чтобы облегчить его для других.

Что такое фильтрация ресурсов?
Во-первых, для тех, кто может не знать, что такое фильтрация ресурсов? Это в основном способ избежать жесткого кодирования значений в файлах и сделать их более динамичными. Например, я могу захотеть отобразить версию моего приложения в моем приложении. Версия обычно определяется в вашем файле сборки, и это значение может быть введено или заменено в вашем файле конфигурации во время сборки. Поэтому я мог бы иметь файл config.properties в каталоге src / main / resources со следующим содержимым:
application.version = $ {application.version}. При фильтрации ресурсов при сборке значение $ {application.version} заменяется на 1.0.0, и тогда мое приложение может загрузить config.properties и отобразить версию приложения.

Это чрезвычайно ценная и мощная функция в инструментах сборки, таких как maven, и я часто пользовался ею.

Фильтрация ресурсов в Gradle Так как
это был мой первый проект gradle, мне нужно было найти рекомендуемый способ включения фильтрации ресурсов в gradle. Моя первая проблема, которую я должен был выяснить, была, где определить собственность. В maven это обычно определяется в файле проекта pom.xml как свойство maven:

<properties>
    <application.version>1.0.0</application>
</properties>

Для gradle подходящим местом кажется файл проекта gradle.properties. Поэтому вы бы добавили следующее в файл gradle.properties вашего проекта (обратите внимание, я не предлагаю вам жестко задавать версию модулей в файле gradle.properties. Очевидно, что значение будет получено из свойства version в вашем проекте. I ‘ Я просто использую это для простого примера):

application.version = 1.0.0

Следующая и самая сложная проблема, которую мне пришлось отследить, — это как на самом деле включить фильтрацию ресурсов. Я надеялся просто установить опцию enableFiltering и определить список включений / исключений, но это не так (дополнительный совет: не выполняйте фильтрацию бинарных файлов, таких как изображения). Я нашел некоторые ресурсы в Интернете, но это  один казалось, лучший подход. Поэтому вам нужно добавить следующее в ваш файл build.gradle:

import org.apache.tools.ant.filters.*

processResources {
    filter ReplaceTokens, tokens: [
        "application.version": project.property("application.version")
    ]
}

Далее вам необходимо обновить файл ресурсов. Поэтому поместите файл config.properties в папку src / main / resources и добавьте следующее:

application.version = @ application.version @

Обратите внимание, использование @ вместо $ {}. Это связано с тем, что gradle основан на  ant , и ant по умолчанию использует символ @ в качестве идентификатора токена, тогда как maven использует $ {}.

Наконец, если вы строите свой проект, вы можете посмотреть в build / resources / main и увидеть файл config.properties со значением 1.0.0. Вы также можете открыть свой артефакт и увидеть тот же результат.

Точечная запись
Следует отметить, что я обычно использую точку или точку для разделения слов для свойств: application.version вместо applicationVersion. Таким образом, вы заметите окружающие кавычки вокруг «application.version» в файле build.gradle. Это необходимо, так как невозможность заключить ключ в кавычки приведет к сбою сборки. Вероятно, потому что динамическая природа Groovy думает, что вы пересекаете объект.

Переопределение
Я также исследовал лучший подход к переопределению свойств в Gradle, так как он немного отличается от того, как это делается в Maven. В maven свойства могут быть переопределены свойствами, определенными в файле setting.xml пользователя или в командной строке с параметром -D. Чтобы переопределить application.version в gradle в командной строке, мне нужно было выполнить следующее:

gradle assembly -Papplication.version = 2.0.0

Если вы хотите переопределить его для всех проектов, вы можете добавить свойство в свой файл gradle.properties в /user_home/.gradle.

Кроме того, если вы переопределяете значение через командную строку, а значение вашего свойства содержит специальные символы, такие как одинарные кавычки, вы можете заключить значение в двойные кавычки, как

показано ниже : gradle assembly -Papplication.version = «2.0 .0’6589 »

Резюме
Ну, я надеюсь, что это поможет, и если кто-то из сообщества gradle найдет лучший способ выполнить фильтрацию ресурсов, я бы хотел узнать об этом. Я также хотел бы, чтобы в Gradle стало проще выполнять фильтрацию ресурсов. Я думаю, что это безумие — добавлять оператор импорта для выполнения чего-то такого простого.