Можно ли использовать JRE JRE с внешними файлами JAR? - PullRequest
1 голос
/ 20 апреля 2019

Функция jlink в Java позволяет вам создать отдельную среду выполнения для приложения.Как правило, все модули, необходимые для этого приложения, объединены в один большой файл «модулей» с помощью jlink.

Мне интересно узнать, есть ли способ исключить некоторые из модулей, чтобы они были отдельными файлами jar, но чтобы jlink мог их найти и запустить приложение.Есть ли способ сделать это?

Один из случаев использования этого, например, если вы имеете дело с библиотекой LGPL.Возможно, вы захотите, чтобы библиотека LGPL была исключена из гигантского «блоба» модулей и оставлена ​​как отдельный jar, так что кто-то, желающий обменять jar на другую версию / настроенную версию, может (что требуется LGPL).

В Jlink есть оператор «статический запрос», который можно использовать для запроса дополнительного модуля.Я полагал, что использование этого может работать, но у меня были проблемы с этим.

Когда я компилирую проект с использованием static, я смог запустить его, включив модули с помощью переключателя «--add-modules» в java.Однако, как только я запустил на нем jlink для создания собственного изображения, я не смог заставить это работать.

Когда я пытаюсь запустить jlinked-проект, я получаю исключения ClassNotFound.

Когда вы запускаете jlink для проекта, он создает собственный образ времени выполнения.Все основные модули проекта помещаются в файл образа, называемый модулями.Я проверил этот файл изображения с помощью команды jimage, и я подтвердил, что этот файл изображения не содержит модули, которые я объявил как статические.

В jlink я попытался поместить файлы jarиз модулей, которые были объявлены статически в каталог с изображением модулей.Затем я пытаюсь использовать «--add-modules», чтобы добавить модули вручную, а также -p и -cp, чтобы указать каталог с jar-файлами, но я все еще получаю исключение ClassNotFound.

1 Ответ

1 голос
/ 20 апреля 2019

Хорошо, я ответил на свой вопрос вскоре после публикации.

Я узнал две вещи:

  1. После создания образа времени выполнения jlink, ваши отдельные jar-файлы (требующие статические модули)) не может быть помещен в тот же каталог libs, что и изображение jlink.

Другими словами, после запуска jlink вы получаете структуру каталогов, подобную этой: bin conf include legal lib

В папке lib хранится образ среды выполнения.Я помещал свои отдельные банки в папку lib, но это не работает.Если вы поместите их в отдельный каталог, это сработает. '

Переключатель "-add-modules" должен находиться перед командой -m в последовательности для запуска образа.

Последняя команда для запуска образа может выглядеть следующим образом:

java --адд-модули org.example.module.here, org.example.another.module.here -p your_jar_directory_here -m your.main.module / your.package.here.Main

Это сработало для меня.Вы должны дать переключателю add-modules модули, которые содержат модули, которые вы включили статически, а ключу -p задается путь к каталогу, содержащему jar с этими модулями.

...