前言
在当前多元化开发环境下,Java作为一种广泛应用的编程语言,其应用部署效率与灵活性的重要性日益凸显。Spring Boot框架以其简洁的配置和强大的功能深受开发者喜爱,而JavaFX则为开发者提供了构建丰富桌面客户端应用的能力。然而,将Spring Boot后端服务与JavaFX前端界面整合并实现高效部署,对许多开发者来说是一项挑战。
GraalVM的出现,恰好解决了这一难题。作为Oracle公司推出的一款高性能运行时环境,它支持多种语言运行,并能将Java应用编译为原生可执行文件,从而大大提升了应用的启动速度和资源利用率。通过利用GraalVM的原生镜像生成工具(Substrate VM),我们可以将Spring Boot应用与JavaFX项目无缝集成,并将其打包为独立的、跨平台的可执行程序。
本教程将深入浅出地为您介绍如何详细安装GraalVM,以及如何在此基础上,将普通的Java项目进行打包,以实现高效便捷的应用部署。我们将逐步解析操作步骤,助您掌握这一技术,提升项目的部署效率和用户体验。
1. 环境搭建
上一篇:GraalVM详细安装及打包springboot、java、javafx使用教程(环境安装篇)
2.项目搭建
1.新建java项目
idea–>file—>new—>project填写好相关信息,选择JDK17
2.导入依赖文件
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>17</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<graalvm.version>23.1.0</graalvm.version>
<!--
大于 0.9.9 的版本会出现构建失败,https://github.com/graalvm/native-build-tools/issues/233
需要增加 <useArgFile>false</useArgFile>
-->
<native.maven.plugin.version>0.9.27</native.maven.plugin.version>
<!-- 启动类 -->
<start-class>com.star.graalvm.AppStart</start-class>
</properties>
<dependencies>
<dependency>
<groupId>org.graalvm.sdk</groupId>
<artifactId>graal-sdk</artifactId>
<version>${graalvm.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
导入编译打包插件
<build>
<plugins>
<!--
* 1. 编译器插件
* 2. 打包插件
* 3. 插件使用链接
https://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html#forceJavacCompilerUse
-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
</plugin>
<!-- 插件使用链接 https://maven.apache.org/plugins/maven-assembly-plugin/assembly.html -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<finalName>${project.build.finalName}</finalName>
<archive>
<manifest>
<mainClass>${start-class}</mainClass>
</manifest>
</archive>
<!-- 表示使用assembly预制的描述符jar-with-dependencies创建包含项目依赖的程序集二进制文件。 -->
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<appendAssemblyId>false</appendAssemblyId>
</configuration>
<!--配置将创建程序集绑定到了package阶段。则在执行mvn package后,会在target目录下生成类似的文件:
XXX-1.0-SNAPSHOT-jar-with-dependencies.jar,在版本和后缀之间的jar-with-dependencies为用于创建程序集的描述符的id,
即自定义的assembly描述符文件中配置的id。如果不想在文件或目录后追加此id,可以在配置中将appendAssemblyId设置为false-->
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 插件使用链接 https://graalvm.github.io/native-build-tools/latest/maven-plugin.html -->
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
<version>${native.maven.plugin.version}</version>
<configuration>
<skip>false</skip>
<!-- 使用参数文件进行原生映像构建 -->
<useArgFile>false</useArgFile>
<!-- 指定镜像名称 如果未提供自定义映像名称,则默认使用项目的工件 ID。-->
<imageName>${project.artifactId}</imageName>
<!-- 指定主类 -->
<mainClass>${start-class}</mainClass>
<!-- 其他参数传递给本机映像生成器 -->
<buildArgs>
--no-fallback
-H:-CheckToolchain
</buildArgs>
<!-- GraalVM 可达性元数据支持 -->
<!-- https://github.com/oracle/graalvm-reachability-metadata -->
<metadataRepository>
<enabled>true</enabled>
</metadataRepository>
<!--
<agent>
<enabled>true</enabled>
</agent>
-->
<!--使用快速构建模式构建映像 -->
<!-- <quickBuild>true</quickBuild>-->
</configuration>
<extensions>true</extensions>
<executions>
<execution>
<goals>
<!-- “native:build”目标已弃用。请改用 'native:compile-no-fork'。 -->
<goal>compile-no-fork</goal>
</goals>
<phase>package</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
3.新建启动类
/**
* @create 2023-09
* @author lstar
*/
public class AppStart {
public static void main(String[] args) {
System.out.println("Hello GraalVM ! \n \n请输入q退出程序!");
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
System.out.println(line);
if ("q".equals(line)) {
System.out.println("Bye");
System.exit(0);
}
}
}
}
3.构建方式exe
执行完成后jar和exe文件生成在target目录下
1.方式一:命令行
使用idea的terminal命令行进入项目目录,使用mvn命令构建
mvn -Pnative native:compile -DskipTests
2.方式二:maven插件
使用idea的maven插件打包idea—>maven—>当前项目—>plugins—>native---->native:compile
4.示例代码
- gitee
- github