Gradle: создайте неисполнимый jar и исполняемый сценарий оболочки с зависимыми библиотеками в качестве дистрибутива пакета

#java #shell #gradle #executable

#java #оболочка #gradle #исполняемый

Вопрос:

Я не большой поклонник создания исполняемых jar-файлов fat для программ Java, поскольку это сопряжено с огромными накладными расходами, когда у меня есть несколько исполняемых программ из одного проекта.

Я хочу иметь возможность создавать единый jar, подобный библиотеке, и создавать соответствующие скрипты .sh, которые в значительной степени имеют структуру:

java -cp classpath_libs main_class program_args…

или любой другой исполняемый файл, в котором я могу настроить его под свои нужды, но аналогичным образом (например: hadoop jar project_jar main_class classpath_libs program_args ). Возможно ли это в gradle? если да, то каким образом? Обратите внимание, мне нужно создать несколько сценариев, использующих разные основные классы из одного проекта.

Ключевое требование здесь — иметь возможность использовать окончательную полностью разрешенную строку classpath.

ОБНОВЛЕНИЕ: я видел примеры использования плагина application, но он создает исполняемый jar с упакованными в него зависимыми библиотеками. Это НЕ то, что я ищу.

Ответ №1:

Насколько я обнаружил, похоже, что нет плагина, который обрабатывает это напрямую. Итак, я использовал java-library плагин, использовал configurations.runtime значение classpath и создал необходимые скрипты и задачу копирования, чтобы скопировать необходимые библиотеки в нужные каталоги. Для тех, кто заинтересован, вы также можете попробовать distZip опцию в application плагине, где gradle создает сценарии для выполнения и упаковывает необходимые библиотеки в дистрибутив. Вы можете взглянуть на выходные данные скрипта, чтобы увидеть, как структурирован путь к классам, и создать нечто подобное.