> 文章列表 > GraalVM编译Java程序为可执行exe文件

GraalVM编译Java程序为可执行exe文件

GraalVM编译Java程序为可执行exe文件

文章目录

  • 一、环境
  • 二、编译为可执行文件有优点同时也有一些弊端
  • 三、安装
  • 四、测试
    • 测试一:将独立的Java文件编译为可执行文件
    • 测试二:将普通Java项目、或springboot3项目转为可执行文件
      • 1. 插件
      • 2、执行编译
      • 3、编译报错解决(划重点)

一、环境

Graalvm 22.3.1 java17 版本下载

Visual Studio 2022 社区版(安装这个是因为编译Java项目为可执行文件需要依赖几个C的头文件和动态链接库)

Windows10系统 64位

二、编译为可执行文件有优点同时也有一些弊端

优点:提升启动速度、改进内存使用、不依赖jre环境
缺点:不方便jvm参数调整(编译时已固化到exe文件内部)、变成C程序有了C程序的优点同时也带上了C的缺点,不再是Java不方便Java的项目分析工具分析程序,不在跨平台,不同CPU架构(x86,x64,arm等)需要分别编译
GraalVM编译Java程序为可执行exe文件

三、安装

这里不再详述具体步骤,参考1, 参考2,安装好GraalVM及native-image组件及visualstudio2022后即可测试

四、测试

测试一:将独立的Java文件编译为可执行文件

实际用得很少,可以了解一下

1.编译使用 GraalVM 的Java17的javac编译test.java为test.class
2. 点击“x64 Native Tools Command Prompt for VS 2022”进入命令行,切换到 test.class目录 cd /d D:/test/ 注意"-d"参数,然后使用native-image命令进行转化native-image test

GraalVM编译Java程序为可执行exe文件

测试二:将普通Java项目、或springboot3项目转为可执行文件

1. 插件

普通Java项目可以使用maven graalvm插件,springboot项目还可以使用springboot(测试用的springboot3.0.4)版本插件

           <plugin><groupId>org.graalvm.buildtools</groupId><artifactId>native-maven-plugin</artifactId><extensions>true</extensions><executions><execution><id>build-native</id><goals><goal>compile-no-fork</goal></goals><phase>package</phase></execution></executions><configuration><skip>false</skip><imageName>demo5</imageName><mainClass>com.example.demo.Demo5Application</mainClass><buildArgs><buildArg>--no-fallback</buildArg><buildArg>--report-unsupported-elements-at-runtime</buildArg></buildArgs></configuration></plugin>
           <plugin><groupId>org.graalvm.buildtools</groupId><artifactId>native-maven-plugin</artifactId></plugin>

2、执行编译

普通maven插件挂在maven package生命周期的,直接install就可以触发了,springboot插件需要使用plugins的native:compile-no-fork进行编译转化,其实直接整会有问题的,以下详述
GraalVM编译Java程序为可执行exe文件

3、编译报错解决(划重点)

这些问题都是环境变量问题,idea无法找到编译需要的命令、头文件、动态链接库。

  1. 需要配置graalvm的环境变量,idea 配置SDK需要使用graalvm JDK17,这样idea就可以使用graalvm JDK17进行编译,并找到native-image命令进行转化
  2. 运行maven编译还会有找不到kernel32.lib, windows.h等问题。需要在环境变量的系统变量增加两个配置项LIB、INCLUDE,用于配置需要的动态链接目录及头文件目录。电脑搜到报错所指文件,如是缺少xx.lib则将文件目录追加到LIB,如是缺少xx.h则将文件目录追加到INCLUDE。
  3. 解决思路

1.报错基本都是none-zero resultGraalVM编译Java程序为可执行exe文件
2.详细报错
GraalVM编译Java程序为可执行exe文件
3. 搜索uulid.lib 找到如下文件,选用x64的
GraalVM编译Java程序为可执行exe文件
4. 将文件夹路径配置环境变量系统变量LIB,解决完所有问题,我的LIB,INCLUDE如下,小版本号尽量一致,如这里都用的10.0.22000
GraalVM编译Java程序为可执行exe文件
GraalVM编译Java程序为可执行exe文件
5. 另注意修改环境变量系统变量需要重启主机,如果配置到用户变量好像重启IDEA就会加载新配置的环境变量