Как я могу использовать Gradle для создания нескольких версий jar с измененной переменной?

Я работаю над проектом Java, который будет распространяться среди нескольких клиентов, но мне необходимо указать имя клиента в переменной в коде Java для использования при ведении журнала и проверке версий.

Есть ли способ установить список параметров в gradle, который при запуске задачи сборки будет генерировать несколько jar-файлов, по одному для каждого из параметров? Для каждого jar-файла потребуется добавить переменную к имени архива и изменить переменную Java в основном классе, чтобы она соответствовала.

Например, если у меня есть ['Client A', 'Client B'] в виде массива градиентов, мне понадобится project-client-a.jar с переменной MainClass.CLIENT = "Client A" и отдельный jar с project-client-b.jar с MainClass.CLIENT = "Client B".

Мой инстинкт состоит в том, чтобы использовать функцию расширения для замены значения в файле свойств, включенном в jar, но я не уверен, как «зациклить» несколько артефактов и сопоставлений замены.

Вероятно, вам нужно написать какой-нибудь умный сценарий

g00se 27.05.2024 23:51
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хотя чистое решение Gradle по-прежнему предпочтительнее, для этого я использовал комбинацию пользовательской задачи Exec и скрипта Python.

import sys
import shutil
import zipfile

from pathlib import Path

clients = ["Client A", "Client B"]

for client in clients:
    Path("./published/" + client).mkdir(parents=True, exist_ok=True)
    with zipfile.ZipFile("./build/libs/PROJECT-" + sys.argv[1] + ".jar", "r") as zipo:
        with zipfile.ZipFile("./published/" + client + "/PROJECT-" + sys.argv[1] + ".jar", "w") as zipf:
            zipf.comment = zipo.comment
            for item in zipo.infolist():
                if item.filename != "PROJECT.properties":
                    zipf.writestr(item, zipo.read(item.filename))
            zipf.writestr("PROJECT.properties", "client = " + client)

Этот код принимает один аргумент (номер версии, который мы настраиваем) и создает копии jar для каждого клиента, удаляя файл свойств теста и записывая новый. У каждого клиента есть папка в «опубликованном» каталоге в корне проекта со своей настроенной версией встроенного jar.

(Этот фрагмент был очищен и немного упрощен, поскольку на самом деле он используется для одновременной упаковки нескольких проектов, поэтому могут быть незначительные синтаксические ошибки.)

Другие вопросы по теме