Сгенерированный Graalvm двоичный файл работает внутри каталога проекта, но не за его пределами

Я использую довольно простое Java-приложение, которое получает входной файл, обрабатывает его и генерирует выходной файл. Я использую Picocli для аргументов приложения и Graalvm для создания собственного двоичного файла. Сначала я создал artifact в intellij, включая библиотеки и указав класс, содержащий основной метод, затем я использовал параметр build artifact для создания файла jar. После этого я использовал следующую команду для создания двоичного файла

native-image -jar metadata-processor.jar

Баночка и бинарник создаются внутри проекта, так как projectName/out/artifacts/app_jar я могу запустить бинарник, используя

./binary -i abc -o xyz

Я могу запустить файл jar, используя

java -jar binary.jar -i abc -o xyz

Однако, когда я перемещаю каталог binary в ~Download и запускаю ту же команду, что и выше, я получаю сообщение об ошибке

./binary -i abc -o xyz
Error: Could not find or load main class Main

Баночка все еще работает, т.е.

java -jar binary.jar -i abc -o xyz

Если я создам простую программу hello world и создам двоичный файл, она будет работать нормально, даже если я перемещу ее в другую папку, так что это похоже на проблему с библиотекой или структуру проекта.

Пожалуйста, дайте мне знать, если в случае с библиотеками требуется какой-то особый шаг.

Похоже, что родной образ не может сгенерировать двоичный файл и возвращается в режим JVM. Попробуйте скомпилировать с помощью --no-fallback, и сборка, скорее всего, не удастся.

zakkak 03.05.2023 14:54

@zakkak да, это не удалось из-за какой-то ошибки типа Error: type is not available in this platform: org.graalvm.nativeimage.impl.ImageSingletonsSupport

Dr. Mian 03.05.2023 14:56

Это из-за mac m1 max или какой-то другой проблемы?

Dr. Mian 03.05.2023 14:57

Я не уверен, если честно. Лучше обновите проблему на github и предоставьте там больше информации (например, полную трассировку стека).

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

Ответы 1

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

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

Шаг 1:

Сначала я создаю файл jar проекта, используя intellij, затем запускаю файл jar, чтобы создать файл конфигурации проекта в каталоге META_INF/native-image, используя -agentlib:native-image-agent т.е.

java -agentlib:native-image-agent=config-output-dir=/Users/mianahmad/goldeneye/json-processor/src/main/resources/META-INF/native-image -jar metadata-processor.jar -i /Users/mianahmad/goldeneye/json-processor/input/Claimant.json -o /Users/mianahmad/goldeneye/json-processor/output/Claimant_output.json

Шаг 2:

После этого я снова создал банку, а затем создал собственный образ.

native-image -jar app-1.0-SNAPSHOT-jar-with-dependencies.jar

После этого я переместил проект в другое место, используя

mv app-1.0-SNAPSHOT-jar-with-dependencies /Users/mianahmad/Desktop

Запустите бинарник и альт все еще работает

./app-1.0-SNAPSHOT-jar-with-dependencies

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