graalvm初探
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补丁。