安装
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的动态代理。