使用GraalVM把Java编译成exe运行

378 阅读2分钟

安装环境

进入下载的vm bin目录下,打开cmd,执行如下命令
安装native-image

gu install native-image  
D:\jdks\graalvm-ce-java11-22.3.1\bin>gu install native-image  
Downloading: Component catalog from www.graalvm.org  
Processing Component: Native Image  
Downloading: Component native-image: Native Image from github.com  
Installing new component: Native Image (org.graalvm.native-image, version 22.3.1)  

查看安装情况

gu list  

如下,表示没有安装,native-image

ComponentId Version Component name Stability Origin  
---------------------------------------------------------------------------------------------------------------------------------  
graalvm 22.3.1 GraalVM Core Supported  

安装成功,会多一个native-image

D:\jdks\graalvm-ce-java11-22.3.1\bin>gu list  
ComponentId Version Component name Stability Origin  
---------------------------------------------------------------------------------------------------------------------------------  
graalvm 22.3.1 GraalVM Core Supported  
native-image 22.3.1 Native Image Early adopter github.com  

编译成本地exe

安装vs,
打开

x64 Native Tools Command Prompt for VS 2022  

设置环境变量

setx /M PATH "D:\jdks\graalvm-ce-java11-22.3.1\bin;%PATH%"  
  
# Java环境  
setx /M JAVA_HOME "D:\jdks\graalvm-ce-java11-22.3.1"  

环境成功

C:\Users\wwj>native-image  
Please specify options for native-image building or use --help for more info.  

开始编译

在上上面的窗口,进入到class文件,
注意需要使用类的全路径,不要带class

native-image xxx  

如果出现某些文件找不到,就使用管理员模式

C:\Users\wwj\IdeaProjects\untitled4\target\classes>native-image org.example.DateTimeTools  
========================================================================================================================  
GraalVM Native Image: Generating 'org.example.datetimetools' (executable)...  
========================================================================================================================  
[1/7] Initializing... (6.2s @ 0.11GB)  
Version info: 'GraalVM 22.3.1 Java 11 CE'  
Java version info: '11.0.18+10-jvmci-22.3-b13'  
C compiler: cl.exe (microsoft, x64, 19.35.32216)  
Garbage collector: Serial GC  
[2/7] Performing analysis... [*****] (11.4s @ 1.16GB)  
3,954 (74.49%) of 5,308 classes reachable  
5,867 (57.38%) of 10,225 fields reachable  
17,663 (43.92%) of 40,213 methods reachable  
27 classes, 0 fields, and 335 methods registered for reflection  
62 classes, 53 fields, and 52 methods registered for JNI access  
1 native library: version  
[3/7] Building universe... (1.8s @ 0.42GB)  
[4/7] Parsing methods... [*] (1.4s @ 1.49GB)  
[5/7] Inlining methods... [***] (1.0s @ 2.07GB)  
[6/7] Compiling methods... [***] (7.1s @ 3.83GB)  
[7/7] Creating image... (2.4s @ 0.50GB)  
5.91MB (40.60%) for code area: 9,695 compilation units  
8.39MB (57.65%) for image heap: 115,109 objects and 6 resources  
260.70KB ( 1.75%) for other data  
14.55MB in total  
------------------------------------------------------------------------------------------------------------------------  
Top 10 packages in code area: Top 10 object types in image heap:  
701.37KB java.util 1.24MB byte[] for code metadata  
473.19KB java.awt 1.12MB java.lang.String  
337.10KB java.lang 1011.96KB byte[] for general heap data  
284.67KB javax.swing 882.65KB java.lang.Class  
275.57KB javax.swing.plaf.metal 696.81KB byte[] for java.lang.String  
234.46KB javax.swing.plaf.basic 403.92KB java.util.HashMap$Node  
215.67KB java.text 352.37KB char[]  
207.96KB java.util.regex 339.80KB com.oracle.svm.core.hub.DynamicHubCompanion  
204.29KB java.util.concurrent 215.41KB java.lang.String[]  
127.54KB com.oracle.svm.core.code 212.30KB java.util.HashMap$Node[]  
2.84MB for 146 more packages 1.59MB for 894 more object types  
------------------------------------------------------------------------------------------------------------------------  
0.8s (2.4% of total time) in 19 GCs | Peak RSS: 4.73GB | CPU load: 4.93  
------------------------------------------------------------------------------------------------------------------------  
Produced artifacts:  
C:\Users\wwj\IdeaProjects\untitled4\target\classes\awt.dll (jdk_lib)  
C:\Users\wwj\IdeaProjects\untitled4\target\classes\fontmanager.dll (jdk_lib)  
C:\Users\wwj\IdeaProjects\untitled4\target\classes\freetype.dll (jdk_lib)  
C:\Users\wwj\IdeaProjects\untitled4\target\classes\java.dll (jdk_lib_shim)  
C:\Users\wwj\IdeaProjects\untitled4\target\classes\javaaccessbridge.dll (jdk_lib)  
C:\Users\wwj\IdeaProjects\untitled4\target\classes\jawt.dll (jdk_lib)  
C:\Users\wwj\IdeaProjects\untitled4\target\classes\jvm.dll (jdk_lib_shim)  
C:\Users\wwj\IdeaProjects\untitled4\target\classes\lcms.dll (jdk_lib)  
C:\Users\wwj\IdeaProjects\untitled4\target\classes\org.example.datetimetools.build_artifacts.txt (txt)  
C:\Users\wwj\IdeaProjects\untitled4\target\classes\org.example.datetimetools.exe (executable)  
========================================================================================================================  
Finished generating 'org.example.datetimetools' in 32.9s.  

编译带有图形功能的Java程序

awt.dll
fontmanager.dll
freetype.dll
java.dll
javaaccessbridge.dll
jawt.dll
jvm.dll
lcms.dll
org.example.datetimetools.build_artifacts.txt
org.example.datetimetools.exe

但是运行时,加载不到图形类,无法运行。

$ ./org.example.datetimetools.exe
Exception in thread "main" java.lang.NoSuchMethodError: java.awt.Toolkit.getDefaultToolkit()Ljava/awt/Toolkit;
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.jni.functions.JNIFunctions$Support.getMethodID(JNIFunctions.java:1259)
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.jni.functions.JNIFunctions$Support.getMethodID(JNIFunctions.java:1244)
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.jni.functions.JNIFunctions.GetStaticMethodID(JNIFunctions.java:413)
        at java.desktop@11.0.18/java.awt.Toolkit.initIDs(Toolkit.java)
        at java.desktop@11.0.18/java.awt.Toolkit.<clinit>(Toolkit.java:1427)
        at java.desktop@11.0.18/java.awt.Component.<clinit>(Component.java:621)
        at java.base@11.0.18/java.lang.Class.ensureInitialized(DynamicHub.java:528)
        at java.base@11.0.18/java.lang.Class.ensureInitialized(DynamicHub.java:528)
        at java.base@11.0.18/java.lang.Class.ensureInitialized(DynamicHub.java:528)
        at java.base@11.0.18/java.lang.Class.ensureInitialized(DynamicHub.java:528)
        at java.base@11.0.18/java.lang.Class.ensureInitialized(DynamicHub.java:528)