Модуль не найден, если graalpy упакован в Spring Boot Jar

Я создаю приложение Spring Boot (3 RC1) с некоторым кодом Python (GraalVM 22.3). Запуск приложения в режиме разработки работает. После сборки Jar с Maven я получаю сообщение об ошибке:


Caused by: org.graalvm.polyglot.PolyglotException: ModuleNotFoundError: No module named 'pystac'
    at org.graalvm.sdk/org.graalvm.polyglot.Context.eval(Context.java:399) ~[org.graalvm.sdk:na]
    at ch.so.agi.sodata.stac.ConfigService.readXml(ConfigService.java:116) ~[classes!/:0.0.1-SNAPSHOT]
    at ch.so.agi.sodata.stac.SodataStacApplication.lambda$init$0(SodataStacApplication.java:60) ~[classes!/:0.0.1-SNAPSHOT]
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:767) ~[spring-boot-3.0.0-RC1.jar!/:3.0.0-RC1]
    ... 13 common frames omitted

python.Executable показывает исполняемый файл graalpy, упакованный в Jar: file:/Users/stefan/sources/datenbezug/sodata-stac/target/sodata-stac-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/venv/bin/graalpy

Grepping the Jar показывает модуль pystac в файле Jar, например. BOOT-INF/classes/venv/lib/python3.8/site-packages/pystac/item.py

Создание контекста с помощью:

var VENV_EXECUTABLE = ConfigService.class.getClassLoader()
                .getResource(Paths.get("venv", "bin", "graalpy").toString())
                .getPath();

var context = Context.newBuilder("python")
                .allowAllAccess(true)
                .option("python.Executable", VENV_EXECUTABLE)
                .option("python.ForceImportSite", "true")
                .build()

Можно ли поместить весь материал Python, включая сторонние библиотеки, в FatJar? Или я просто пропустил какое-то волшебство упаковки?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
0
0
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Проблема в том, что файловая система Truffle по умолчанию, AFAIK, поддерживает только фактическую файловую систему вашей ОС, т. е. не «видит» ресурсы в файле jar. Вот почему он работает в режиме разработки, когда ресурсы — это просто файлы в файловой системе.

Есть два варианта, как с этим бороться:

  • не помещайте venv в ресурсы, а развертывайте его отдельно, чтобы он оказался где-то в файловой системе
  • внедрить пользовательскую файловую систему Truffle, но я пока не знаю никого, кто пробовал это с виртуальными средами, поэтому могут быть некоторые шероховатости. В частности, GraalVM LLVM Toolchain, который используется для создания собственных расширений Python для выполнения с помощью механизма GraalVM LLVM, создает специфичные для системы двоичные файлы, поэтому ваш jar не будет таким переносимым, как можно было бы ожидать от jar. Если вы используете только чистые пакеты Python, это может быть нормально.

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