一、安裝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!