graalvm是普通JDK的增强版,支持AOT特性,可将jar包转成本地可执行文件,提升启动时间,减少内存占用。同时还支持多语言融合编程,支持python/ruby/js等语言。
安装
到oracle官网下载graalvm21,对应jdk21。旧有的jdk21程序无需修改,可直接跑在graalvm上。
转成本地可执行文件要使用native-image工具,windows下需提前安装visual studio2022 build tools,这个链接可下载:
https://visualstudio.microsoft.com/zh-hans/downloads/
下载时勾选“C++桌面开发”这一个组件即可。
安装好visual studio2022 build tools,重启机器。
最后使用:
native-image -jar your-jar-file
就能把打包的jar转成exe,直接执行exe好了。
转成的exe大小比原始jar小很多,且无需依赖java虚拟机了。
多语言融合编程
python
代码调用样例:
import org.graalvm.polyglot.Context;
try (Context ctx = Context.newBuilder(PYTHON_LAN)
.allowAllAccess(true)
.option("python.PythonPath", "src/main/resources/python")
.build()) {
ctx.eval(PYTHON_LAN, "import myscript; myscript.run()");
}
通过Context类,在java里调用python脚本。有点像普通jdk里的ScriptEngine。
注意:这里的allowAllAccess是不能省略的,因为polyglot引擎访问特定目录是需要权限的。
pom依赖:
<dependencies>
<dependency>
<groupId>org.graalvm.polyglot</groupId>
<artifactId>polyglot</artifactId>
<version>24.2.1</version>
</dependency>
<dependency>
<groupId>org.graalvm.polyglot</groupId>
<artifactId>python</artifactId>
<version>24.2.1</version>
<type>pom</type>
</dependency>
graalpy的venv创建(也是通过maven插件):
<build>
<plugins>
<plugin>
<groupId>org.graalvm.python</groupId>
<artifactId>graalpy-maven-plugin</artifactId>
<version>24.2.1</version>
<configuration>
<!-- packages类似requirements.txt里的内容 -->
<packages> <!-- ① -->
<package>PyYAML==6.0.2</package>
</packages>
<externalDirectory> <!-- ② -->
${project.basedir}/python-resources
</externalDirectory>
</configuration>
<executions>
<execution>
<goals>
<goal>process-graalpy-resources</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
特别说明的是,graalpy的pip跟普通python的pip共用一套配置,也就是.pip/pip.conf(windows下是pip/pip.ini文件)。下载的过程中,可能会去找三方包的graalpy补丁。

3443

被折叠的 条评论
为什么被折叠?



