Я создаю приложение 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? Или я просто пропустил какое-то волшебство упаковки?
Проблема в том, что файловая система Truffle по умолчанию, AFAIK, поддерживает только фактическую файловую систему вашей ОС, т. е. не «видит» ресурсы в файле jar. Вот почему он работает в режиме разработки, когда ресурсы — это просто файлы в файловой системе.
Есть два варианта, как с этим бороться: