安装
1  |  | 
组件
- Grallvm自带一个名为
gu的组件管理器,如果需要安装其他语言的组件可以使用其安装,包括打包为可执行文件的native-image也需要通过gu安装。 - 由于官网被墙,需要科学上网
 
1  |  | 
1  |  | 
入门使用
编写Java程序
1  |  | 
1  |  | 
过程如下:
1  |  | 
最后产生了一个文件名为main的可执行文件(我的文件名为Main.java)。
然后执行:
1  |  | 
一个Hello world打包下来有9.1M。虽然比起C之类的打包还是要大很多,不过想对于集成JRE已经很好了
注意
中途如果出现类似:

的报错,请先安装依赖。
1  |  | 
Windows额外配置
- 如果想在Win10打包
exe文件需要额外配置。- vs官网下载VS:链接
 - 安装好后,安装以下扩展:
 
- 找到
vs安装路径\VC\Tools\MSVC\14.28.29333\bin\Hostx64\x64,将其注册到PATH环境变量(**打包exe需要cl.exe**)。 
- 找到VS下载的
Windows Kits文件夹,添加以下环境变量LIB和INCLUDE(**注意大写,cl.exe打包需要的依赖**),然后添加以下路径: 

- 然后保留上面的两个文件夹,VS就可以卸载了。可以像我一样移动到别的地方。
 
 - 或者参考文章:Win10使用native,配置相关的环境变量
 
集成Maven
添加依赖:
- 注意:
- 在
plugin的配置中有一个mainClass属性必须指定(含有Main方法的类),否则会无法打包。 - 如使用IDEA之类的工具,请把JDK切换为Graalvm
 
 - 在
 
- 注意:
 ```xml
21.0.0 cn.gloduck.vertx.Main org.graalvm.sdk graal-sdk ${graalvm.version} provided org.graalvm.nativeimage native-image-maven-plugin ${graalvm.version} org.graalvm.nativeimage native-image-maven-plugin ${graalvm.version} native-image package false cn.gloduck.vertx.Main example --no-fallback 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
+ 指定了MainClass后每次只需要点击`Package`就能打包成可执行文件了。
# 打包SpringBoot
注意:以下内容为摘录内容。
参考:[Github](https://github.com/jonashackt/spring-boot-graalvm#relocate-annotation-classpath-scanning-from-runtime-to-build-time)
pom添加依赖:
```xml
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-indexer</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-graalvm-native</artifactId>
<version>0.7.1</version>
</dependency>
指定启动类路径:
1  |  | 
配置一个独立的 profile,在编译时通过 native-image-maven-plugin 插件将其编译成本地可执行文件。
1  |  | 
该插件在 Maven 中央仓库不存在,需要指定 pluginRepositories 和 repositories:
1  |  | 
Native Image对Java动态特性的处理
由于Native Image是静态分析及AOT编译,编译器不能完全准确地预估目标应用所依赖的所有动态特性。为了保证功能的完整性,GraalVM Native Image为以下四种动态特性提供了特殊处理:
- Java Native interface (JNI)
 - Java Reflection
 - Dynamic proxy (java.lang.reflect.Proxy)
 - Class path resources (Class.getResource)
 
注意
- Graal VM不支持CGLIB,只能使用JDK动态代理
 - 如果是打包SpringBoot之类的程序,可能由于某些特性不支持,出错。如:
- 动态代理:SpringBoot默认使用的是CGLIB动态代理。目前不支持CGLIB。所以要关闭SpringBoot的动态代理。