有一种方法可以使用 GraalVM 及其 Python 模块来运行使用 Java 包的 Python 脚本
graalpython
。这是示例https://github.com/paulvi/graalpython-java-template
我想知道是否可以将 GraalVM 引擎和
graalpython
捆绑到我的 Java 应用程序中并生成 jar 或本机映像(例如使用 GraalVM 项目中的本机映像编译器)?
从版本 23.1 开始,通过使用 Mavencentral 上发布的 Maven 工件,所有 GraalVM 附加语言现在都可以轻松嵌入到 Java 中,包括非 Graal JDK(但有警告!)。这些工件嵌入并透明地按需提取必要的文件。
关于本机映像,这些语言现在的行为就像任何其他支持本机映像的 Java 库一样。本机映像不需要额外的选项,只需将相关的 jar 放在模块路径(最好)或类路径上即可。
因此,在 Java 中嵌入 GraalPy 就像将其添加到 pom.xml 中一样简单(或您选择的构建系统的等效代码):
<dependencies>
<dependency>
<groupId>org.graalvm.polyglot</groupId>
<artifactId>polyglot</artifactId>
<version>23.1.0</version>
</dependency>
<dependency>
<groupId>org.graalvm.polyglot</groupId>
<artifactId>python-community</artifactId>
<version>23.1.0</version>
<type>pom</type>
</dependency>
</dependencies>
要生成本机映像,可以使用本机映像的 Maven 插件。
更多 GraalPy 文档。
适用于版本的旧答案< 23.1
我认为您可以将整个 GraalVM 发行版与您的应用程序捆绑在一起,就像其他一些应用程序与普通 JDK 所做的那样(例如,我认为 IntelliJ 将 JDK 与其捆绑在一起)。这将是最简单的选择。
您至少需要 GraalPython 主目录,其中包含 GraalPython 运行任何有意义的程序所需的 Python 标准库和其他文件。
而且,如果你想以JVM模式运行,那么你需要在GraalVM上运行,其他JDK不支持。理论上,您也许可以以某种方式破解它,以便使用 JVMCI 在普通 JDK 上运行 GraalPython,就像使用 JavaScript [0] 一样,但使用 GraalPython 会更加复杂。
理论上,您可以通过提供自定义文件系统实现将 GraalPython 主目录捆绑到您的应用程序中1。
[0] https://www.graalvm.org/reference-manual/js/RunOnJDK/
1https://www.graalvm.org/truffle/javadoc/org/graalvm/polyglot/io/FileSystem.html