当前位置: 首页 > news >正文

GraalVM详细安装及打包springboot、java、javafx使用教程(打包普通JAVA项目篇)

前言

在当前多元化开发环境下,Java作为一种广泛应用的编程语言,其应用部署效率与灵活性的重要性日益凸显。Spring Boot框架以其简洁的配置和强大的功能深受开发者喜爱,而JavaFX则为开发者提供了构建丰富桌面客户端应用的能力。然而,将Spring Boot后端服务与JavaFX前端界面整合并实现高效部署,对许多开发者来说是一项挑战。

GraalVM的出现,恰好解决了这一难题。作为Oracle公司推出的一款高性能运行时环境,它支持多种语言运行,并能将Java应用编译为原生可执行文件,从而大大提升了应用的启动速度和资源利用率。通过利用GraalVM的原生镜像生成工具(Substrate VM),我们可以将Spring Boot应用与JavaFX项目无缝集成,并将其打包为独立的、跨平台的可执行程序。

本教程将深入浅出地为您介绍如何详细安装GraalVM,以及如何在此基础上,将普通的Java项目进行打包,以实现高效便捷的应用部署。我们将逐步解析操作步骤,助您掌握这一技术,提升项目的部署效率和用户体验。

1. 环境搭建

上一篇:GraalVM详细安装及打包springboot、java、javafx使用教程(环境安装篇)
下一篇:GraalVM详细安装及打包springboot、java、javafx使用教程(打包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.示例代码

  1. gitee
  2. github

相关文章:

  • Python 指南-最短路径(Dijkstra 算法):
  • 【微服务】Spring Boot 版本升级到 2.7.18
  • Web安全基础入门+信息收集篇
  • 3.21 ARM day5
  • Java学习笔记01
  • 基于ssm的学生选课管理系统的设计与实现
  • 基于ssm的酒店民宿管理系统的设计与实现
  • JAVA面向对象编程 JAVA语言入门基础
  • 【机器学习-07】逻辑回归(Logistic Regression)的介绍和python实现
  • LeetCode 1027——最长等差数列
  • 开源流程图表库(02):Draw.io在线绘制各类图表,导出html使用
  • 【jvm】jinfo使用
  • javaSwing宿舍管理系统(三个角色)
  • MySQL--select count(*)、count(1)、count(列名) 的区别你知道吗?
  • 在 MacOS 中安装
  • [译]Python中的类属性与实例属性的区别
  • 【刷算法】求1+2+3+...+n
  • Django 博客开发教程 16 - 统计文章阅读量
  • input的行数自动增减
  • SpiderData 2019年2月25日 DApp数据排行榜
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 给初学者:JavaScript 中数组操作注意点
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 批量截取pdf文件
  • 前端学习笔记之观察者模式
  • 少走弯路,给Java 1~5 年程序员的建议
  • 协程
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #数学建模# 线性规划问题的Matlab求解
  • #图像处理
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (1) caustics\
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (pojstep1.3.1)1017(构造法模拟)
  • (Ruby)Ubuntu12.04安装Rails环境
  • (六)vue-router+UI组件库
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .Net 应用中使用dot trace进行性能诊断
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .sh 的运行
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • [100天算法】-不同路径 III(day 73)
  • [Android]使用Git将项目提交到GitHub
  • [Bugku]密码???[writeup]
  • [C++]类和对象(中)
  • [CSAWQual 2019]Web_Unagi ---不会编程的崽
  • [hdu 1247]Hat’s Words [Trie 图]
  • [HOW TO]怎么在iPhone程序中实现可多选可搜索按字母排序的联系人选择器