我正在使用一些 Python 代碼(GraalVM 22.3)構建一個 Spring Boot(3 RC1)應用程式。在開發模式下運行應用程式有效。使用 Maven 構建 Jar 后出現錯誤:
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在 Jar 中打包的 graalpy 可執行檔案:file:/Users/stefan/sources/datenbezug/sodata-stac/target/sodata-stac-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/venv/bin/graalpy
Grepping the Jar 顯示pystacJar 檔案中的模塊,例如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 中?還是我只是錯過了一些包裝魔法?
uj5u.com熱心網友回復:
問題是默認的 Truffle 檔案系統 AFAIK 僅支持您作業系統的實際檔案系統,即它不會“看到”jar 檔案中的資源。這就是為什么當資源只是檔案系統上的檔案時它在開發模式下作業的原因。
有兩種選擇如何處理這個問題:
- 不要將 venv 放入資源中,而是單獨部署它,以便它最終位于檔案系統的某個位置
- 實作自定義Truffle 檔案系統,但我不知道有人在虛擬環境中嘗試過這個,所以可能會有一些粗糙的邊緣。最值得注意的是 GraalVM LLVM 工具鏈,它用于構建 Python 原生擴展以與 GraalVM LLVM 引擎一起執行,生成系統特定的二進制檔案,因此您的 jar 不會像預期的 jar 那樣可移植。如果你只使用純 Python 包,那可能沒問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/531984.html
標籤:弹簧靴graalvm巨蟒
上一篇:帶有身份驗證彈簧的無限回圈
