Graalvm上手体验
一、安装GraalVM
官方文档:Getting Started with GraalVM
从GraalVM下载,GraalVM官方提供了社区版和企业版。直接下载社区版,可以选择基于java8或基于java11等不同环境的版本。由于我使用的java8,所以下载基于java8的版本。
1.下载后解压,设置环境变量
JAVA_HOME = C:\dev\Tools\graalvm-ce-java8-21.1.0 GRAALVM_HOME = C:\dev\Tools\graalvm-ce-java8-21.1.0 PATH中添加 %GRAALVM_HOME%\bin
2.安装native-image
配置好环境变量后,{GRAALVM_HOME}/bin/gu就能直接访问了
C:\Users\lp>gu install native-image Downloading: Component catalog from www.graalvm.org Processing Component: Native Image Downloading: Component native-image: Native Image from github.com Installing new component: Native Image (org.graalvm.native-image, version 21.1.0)
3.windows平台安装Microsoft Visual C++ (MSVC)
如果在实践中出现以下错误,则是没有安装MSVC或者没有进行环境初始化。
Error: Default native-compiler executable 'cl.exe' not found via environment variable PATH
在windows平台上build本地GraalVM镜像,就需要安装Microsoft Visual C++ (MSVC)。MSVC的版本取决于GraalVM依赖的java版本。具体详情参考官方说明:Prerequisites for Using Native Image on Windows
官方的解决方法如下:
1)基于JDK8的GraalVM,需要MSVC 2010 SP1 version,并推荐的安装方法是使用Microsoft Windows SDK 7.1:直接从Window SDK 7.1 image from Microsoft下载GRMSDKX_EN_DVD.iso,然后F:\Setup\SDKSetup.exe直接挂起镜像。(这里不知道官方文档想表达什么意思,我直接安装后也不起作用。最后我直接安装Visual Studio 2017 Visual C++ Build Tools解决问题。)
2)基于JDK11的GraalVM,需要MSVC 2017 15.5.5或之后版本。
stackoverflow上也有该问题:cl.exe missing when building native app using GraalVM
4.初始化环境
直接执行命令初始化环境
#VS2017 call "C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Auxiliary\Build\vcvars64.bat" #VS2019 call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\ Build\vcvars64.bat”
或者手动点击命令提示符来初始化
我直接使用命令来初始化,如下
D:\>call "C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Auxiliary\Build\vcvars64.bat" ********************************************************************** ** Visual Studio 2017 Developer Command Prompt v15.0 ** Copyright (c) 2017 Microsoft Corporation ********************************************************************** [vcvarsall.bat] Environment initialized for: 'x64'
二、入门案例
1.先编写一段Java代码
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }
手动编译
D:\>javac HelloWorld.java
运行,输出“Hello World”,表明程序没有问题。
D:\>java HelloWorld
Hello, World!
2.编译
D:\>native-image HelloWorld [helloworld:11552] classlist: 8,569.48 ms, 1.14 GB [helloworld:11552] (cap): 3,427.01 ms, 1.14 GB [helloworld:11552] setup: 7,834.29 ms, 1.62 GB [helloworld:11552] (clinit): 182.21 ms, 1.62 GB [helloworld:11552] (typeflow): 7,517.48 ms, 1.62 GB [helloworld:11552] (objects): 4,503.86 ms, 1.62 GB [helloworld:11552] (features): 279.05 ms, 1.62 GB [helloworld:11552] analysis: 12,821.36 ms, 1.62 GB [helloworld:11552] universe: 635.62 ms, 1.62 GB [helloworld:11552] (parse): 2,408.88 ms, 1.65 GB [helloworld:11552] (inline): 2,643.45 ms, 1.65 GB [helloworld:11552] (compile): 14,668.37 ms, 1.87 GB [helloworld:11552] compile: 20,715.77 ms, 1.87 GB [helloworld:11552] image: 1,928.67 ms, 1.87 GB [helloworld:11552] write: 3,047.36 ms, 1.87 GB # Printing build artifacts to: helloworld.build_artifacts.txt [helloworld:11552] [total]: 56,019.11 ms, 1.87 GB
3.运行
注意,生成的可执行文件名称大小写。
D:\>helloworld
Hello, World!