zoukankan      html  css  js  c++  java
  • GraalVM入门到精通

    介绍
    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

  • 相关阅读:
    [洛谷P4513][题解]小白逛公园
    [洛谷P2564][题解][SCOI2009]生日礼物
    [洛谷P3384][题解]轻重链剖分
    [洛谷P2607][题解][ZJOI2008]骑士
    第一次个人编程作业
    第一次博客作业
    第一次个人编程作业
    第一次博客作业
    1.初识数据库系统
    1.计算机发展历程
  • 原文地址:https://www.cnblogs.com/javalinux/p/15791024.html
Copyright © 2011-2022 走看看