准备
visual studio
安装vs
注意标红的三项
最好安装在默认目录,非默认也可以,只不过环境变量要自己找路径,我这里是ide在默认路径,缓存和工具不在默认
环境变量配置
INCLUDE:
F:\Windows Kits\10\Include\10.0.19041.0\ucrt;
F:\Windows Kits\10\Include\10.0.19041.0\um;
F:\Windows Kits\10\Include\10.0.19041.0\shared;
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include;
LIB:
F:\Windows Kits\10\Lib\10.0.19041.0\ucrt\x64;
F:\Windows Kits\10\Lib\10.0.19041.0\um\x64;
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\lib\x64;
PATH:
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\bin\Hostx64\x64
graalvm
选择社区版
把jdk的环境变量都改成这个
使用命令:gu install native-image
可能识别到其他的gu,可以到目录下使用,注意:由于是从github下载,所以网络可能有问题,个人使用手机流量并且管理员运行cmd可以正常下载(不知道为什么管理员才行)
打包
这里不在介绍单个文件的打包,直接使用一个maven项目
打包过程
一个简单的maven项目
附上pom.xml
注意:<mainclass>
改成自己的入口函数</mainclass>
并且<graalvm.version>
版本要和你下载的一致
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>graalvmTest</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<graalvm.version>21.2.0</graalvm.version>
</properties>
<dependencies>
<dependency>
<groupId>org.graalvm.sdk</groupId>
<artifactId>graal-sdk</artifactId>
<version>${graalvm.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.graalvm.nativeimage</groupId>
<artifactId>native-image-maven-plugin</artifactId>
<version>${graalvm.version}</version>
<executions>
<execution>
<goals>
<goal>native-image</goal>
</goals>
<phase>package</phase>
</execution>
</executions>
<configuration>
<skip>false</skip>
<imageName>test</imageName>
<mainClass>pers.mtx.main</mainClass>
<buildArgs>
--no-fallback
</buildArgs>
</configuration>
</plugin>
</plugins>
</build>
</project>
直接maven clean->complie->package就ok了
如果打包报错 cl.exe 就是path环境变量没有配置正确
其他错误则是另外两个环境变量的问题
另外更新环境变量后idea要重新开一下,否则有时候环境变量不生效
复杂项目的问题
打包的exe如果有反射等用法,很容易发生ClassNotFound的报错
Graalvm通过静态分析提前编译来为Java应用程序构建高度优化的本机可执行文件,这就需要在编译时就知道所有的程序类型,而java中的反射、动态代理等功能,在编译时不确定具体的类型,所以在使用GraalVm构建native image前需要通过配置列出反射可见的所有类型。而程序内置提供了agentlib
1.打包项目为jar
这里附上一个maven打包的配置
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<!-- 此处指定main方法入口的class -->
<mainClass>pers.mtx.main</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>assembly</goal>
</goals>
</execution>
</executions>
</plugin>
2.使用agentlib打包跟踪jvm生成配置文件
java -agentlib:native-image-agent=config-output-dir=.\peizhi\ -jar E:\JAVA\mtCRUD\target\mtCRUD-1.0-SNAPSHOT.jar
执行jar后尽量多测试,以便于追踪到所有动态的类
生成文件类似这样
3.更改jar包
META-INF中的native-image中新增带有groupid和artifactId的路径,并且将配置文件粘贴
4.打包
native-image -jar E:\JAVA\mtCRUD\target\mtCRUD-1.0-SNAPSHOT.jar --no-fallback
需要加–no-fallback 否则需要jvm才能运行
如果报错,类似这样
就在后面加上参数
最终:
内存占用比原生的少很多