介绍
GraalVM是一个类似于JVM的虚拟机,但还可以编译和运行多种语言,如C++, JS, Python。当然这里我们介绍它最特别之处:可以把Java应用直接转换成最精简的本地二进制应用(exe, elf等),然后可以脱离JVM,直接在本地平台运行。此处重点介绍exe。
安装
安装VS环境(这里是VS2022),需要安装的组件如下
从Github下载GraalVM解压包,我这里用的是graalvm-ce-java17-windows-amd64-21.3.0.zip。下载完解压到某个路径下,我这里是 D:/OK/GraalVM
添加环境变量D:\OK\GraalVM\bin
打开控制台,运行gu install native-image(需要科-学-S-W),这个包能提供创建本地镜像的能力。(native-image 命令)
用法
控制台应用
编写一个java文件
我这里路径为 D:/OK/test-se/Main.java,内容如下:
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
System.out.println(“Hello World!”);
System.in.read();
}
}
编译这个java文件(javac),得到Main.class
打开X64 Native Tools Command Prompt for VS 2022,如图:
这个命令行集成了C++的编译环境,用来生成目标exe文件。
在这个命令行中cd到Main.class的文件夹,输入
native-image Main
稍等片刻,即可看到生成了main.exe。
main.exe大小只有14.5MB,比JLink生成的还小。双击打开效果如下,相当成功!
JavaFX应用
这次我们难度加大点,来启动一个JavaFX应用。
我们都知道,从JDK11开始JavaFX就被移出了,使用时需要我们自己导入对应的jar包。
构建项目
注: 这里我们需要生成单jar包(fat jar),所以要求项目必须写单独的启动类,不能在继承Application的类中直接写Main方法,否则会因为使用非模块的启动方式而报错:
错误: 缺少 JavaFX 运行时组件, 需要使用该组件来运行此应用程序
生成单独的jar包
pom.xml加入以下内容
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>单独启动类的全类名</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
然后执行maven package,执行完毕后把项目目录的target/*-jar-with-denpendencies.jar(单jar文件)复制出来,重命名备用。(我这里复制到D:/OK/test-fx/fx-demo.jar)
生成配置文件
注:因为GraalVM是在编译时把所有用到的类都放在最后的二进制文件中,而它却无法觉察到反射,jni等操作,所以需要我们编写配置文件告诉它,让他把反射用到的class文件,jni调用的dll文件等也都加进来,这样才能正确运行JavaFX应用。
在VS控制台中,我们先cd到jar文件的目录,然后执行以下命令:
D:\OK\GraalVM\bin\java -agentlib:native-image-agent=config-output-dir=./config -jar fx-demo.jar
这个命令会运行jar包,然后在运行时记录它调用的资源到config文件夹的一些json文件中。
执行成功以后,试用一下被打开的JavaFX应用(方便配置文件的记录,防止少记录反射等信息),然后关闭应用,就在资源管理器中就能看到在jar文件的旁边生成了一个config文件夹,打开以后出现这些文件:
其中reflect-config.json记录了反射的类,jni-config.json记录了jni的方法,resource-config.json记录了调用的dll资源,其他的还有动态代理调用情况等等。
生成exe文件
在刚刚的VS控制台执行以下命令:
native-image -H:ConfigurationFileDirectories=./config -jar fx-demo.jar
该命令会根据jar文件和刚刚生成的config文件夹中的配置文件生成最终的exe可执行文件。
结果竟然报错了:
不过我们在jar文件的目录下看到生成了以下文件:
其实这个错误应该是GraalVM的一个bug,不影响exe生成。
然后我们删除目录下多余的文件:awt.dll, java.dll, fx-demo.build_artifacts.txt。
打开exe
生成的exe只有37.3MB!打开fx-demo.exe,可以看到以下内容:
测试成功!!!
注:黑框暂时不知道怎么去除。
总结
GraalVM可以把java应用程序直接转换为本地应用,运行时不再依赖JVM,并且最终的成品还比JLink更小,是个相当不错的工具。
————————————————
版权声明:本文为CSDN博主「Killer Jmc」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_16093119/article/details/122160901