[devel] xgradle плагин - новый способ сборки

Ivan Khanas xeno на altlinux.org
Сб Авг 2 16:26:55 MSK 2025


Создана первая версия плагина для системы сборки gradle.
Плагин позволяет разрешать зависимости используя присутствующие в 
системе артефакты (jar и pom файлы).
В перспективе это может помочь избавиться от вендоринга зависимостей при 
сборке пакетов например таких как:

linstor - https://packages.altlinux.org/ru/sisyphus/srpms/linstor/
apache-kafka - https://packages.altlinux.org/ru/sisyphus/srpms/kafka/
opensearch - https://packages.altlinux.org/ru/sisyphus/srpms/opensearch/

также можно будет собрать проекты по типу spring-framework, поскольку 
они переходят на gradle в связи с его удобством для крупных проектов.

СЦЕНАРИЙ ИСПОЛЬЗОВАНИЯ

Init скрипт плагина устанавливается в директорию с init скриптами 
системы сборки gradle (gradle/init.d), jar файл устанавливается в 
директорию плагинов gradle (gradle/lib/plugins). При запуске сборки 
плагин воздействует на стратегию разрешения зависимостей и на 
конфигурацию. Это позволяет разрешать зависимости с использованием 
системных артефактов. Всё что надо будет сделать пользователю, это 
поставить соответствующий rpm пакет в сборочное окружение.


      Принцип работы

На директорию содержащую jar файлы устанавливается flatDir репозиторий 
для поиска необходимых jar файлов. Так как структура файловой системы 
дистрибутива Linux сильно разнится с архитектурой maven или ivy 
репозиториев, у нее нет такого уровня вложенности и паковать библиотеки 
на java во что-то на подобии 
(/usr/share/java/org/xmlunit/xmlunit-assertj3/2.10.3/xmlunit-assertj3-2.10.3.jar) 
никто не хочет. Плагин решает и эту проблему установкой flatDir 
репозитория с контролируемой глубиной рекурсивного обхода по уровням 
(сейчас стоит 3). Также у сопровождающих бывают идеи о переименовывании 
jar файлов или pom файлов. Плагин позволяет переименовывать файлы при 
соблюдении некоторых условий.

Сама стратегия разрешения использует некоторую эвристику, например для 
зависимости вида: org.junit.jupiter:junit-jupiter генерируются варианты 
имен pom файла -> находится потенциальный pom -> находится валидный pom 
-> ищется jar файл по artifactId -> подхватываются все транзитивные 
зависимости -> для каждой из них выполняется то же самое -> в конце 
недостающие зависимости добавляются в конфигурацию.

Система сборки gradle не разрешает несоответствие версий, то есть в 
ситуации когда в системе находится модуль, чья версия не соответствует 
запрашиваемой, то gradle обращается к кэшу и происходит ошибка. Теперь 
же на этапе конфигурации происходит подстановка версии (запрашиваемой на 
системную)

Пример: Override version: org.assertj:assertj-core:3.25.1 -> 3.19.0

Также плагин умеет работать с BOM (Bill-of-Materials) файлами (разрешать 
и удалять их из конфигурации)
Транзитивными зависимостями (каждая добавляется в соответствии с ее scope)


      Достоинства предлагаемого улучшения:

На данный момент java проекты, которые используют gradle в качестве 
системы сборки собираются просто выкачиванием откомпилированных в 
byte-code артефактов (вендорингом).

Итак, плагин позволяет:

Cобирать Java-проекты в полностью офлайн-режиме, используя только 
системные артефакты, без обращения к внешним репозиториям.

Существенно упрощает интеграцию Gradle-проектов в процесс сборки 
дистрибутива, делая его воспроизводимым, прозрачным и независимым от 
сторонних ресурсов.

Избавляет от необходимости вендоринга зависимостей, тем самым уменьшая 
дублирование, объем исходных пакетов и потенциальные проблемы с 
лицензированием.

Совместим с типовой организацией библиотек в Linux-дистрибутивах 
(например, /usr/share/java) без необходимости имитировать структуру Maven.

Облегчает работу мейнтейнеров и сборочных систем, снижая барьер на 
добавление и обновление Java-пакетов в дистрибутиве (форсирование версий).

Плагин называется xgradle - https://altlinux.space/ALTLinux/xgradle


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

  Также работать над логикой правильного добавления в конфигурацию 
зависимостей.

----------- следующая часть -----------
Вложение в формате HTML было удалено...
URL: <http://lists.altlinux.org/pipermail/devel/attachments/20250802/4d87408e/attachment.html>


Подробная информация о списке рассылки Devel