GraalVM详细安装及打包springboot、java、javafx使用教程(打包springboot2篇)

前言

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

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

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

1. 环境搭建

上一篇:GraalVM详细安装及打包springboot、java、javafx使用教程(打包javafx项目篇)
下一篇:GraalVM详细安装及打包springboot、java、javafx使用教程(打包springboot3篇)

2.项目搭建

1.新建java项目

idea–>file—>new—>project填写好相关信息,选择JDK17
在这里插入图片描述

在这里插入图片描述

2.完整项目结构

在这里插入图片描述

3.导入依赖文件

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.7</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <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>
        <spring.native.plugin.version>0.12.2</spring.native.plugin.version>
        <start-class>com.shin.graalvm.Springboot2Application</start-class>
    </properties>

依赖

 <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-indexer</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.experimental</groupId>
            <artifactId>spring-native</artifactId>
            <version>${spring.native.plugin.version}</version>
        </dependency>
    </dependencies>

导入编译打包插件

 <build>
        <plugins>
            <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>
                </configuration>
                <extensions>true</extensions>
                <executions>
                    <execution>
                        <goals>
                            <goal>build</goal>
                        </goals>
                        <phase>package</phase>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.springframework.experimental</groupId>
                <artifactId>spring-aot-maven-plugin</artifactId>
                <version>${spring.native.plugin.version}</version>
                <configuration>
                    <mode>native</mode>
                </configuration>
                <executions>
                    <execution>
                        <id>generate</id>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <image>
                        <buildpacks>
                            <buildpack>gcr.io/paketo-buildpacks/java-native-image:${graalvm.version}</buildpack>
                        </buildpacks>
                    </image>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-milestone</id>
            <name>Spring milestone</name>
            <url>https://repo.spring.io/milestone</url>
        </repository>
    </repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>spring-milestone</id>
            <name>Spring milestone</name>
            <url>https://repo.spring.io/milestone</url>
        </pluginRepository>
    </pluginRepositories>

4.新建java类

1.启动类
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.Environment;

/**
 * @create 2023-09
 * @author lstar
 */
@SpringBootApplication
public class Springboot2Application {



    public static void main( String[] args )
    {
        SpringApplication springApplication = new SpringApplication(Springboot2Application.class);
        //banner模式默认在控制台显示,Banner.Mode.OFF : 关闭banner显示
        springApplication.setBannerMode(Banner.Mode.OFF);
        ConfigurableApplicationContext run = springApplication.run(args);

        Environment environment = run.getBean(Environment.class);
        // 自动打开浏览器访问项目地址
        String osName = System.getProperty("os.name", "");
        if (osName.contains("Windows")) {
            try {
                Runtime.getRuntime().exec("cmd /c start http://127.0.0.1:" + environment.getProperty("server.port") + "?autoclose=1");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
2.controller类
package com.shin.graalvm.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.Map;

/**
 * @create 2023-09
 * @author lstar
 */
@Controller
@CrossOrigin
public class HomeController {

    @GetMapping("/")
    public String home() {
        return "Home";
    }

    @ResponseBody
    @GetMapping("/hello/{name}")
    public Map home(@PathVariable String name) {
        return new HashMap<String, Object>() {{
            put("code", 0);
            put("message", "Hello " + name);
        }};
    }
    @ResponseBody
    @GetMapping("/info/graalvmInfo")
    public String graalvmInfo() {
        return """
                一、GraalVM是什么?
                GraalVM是 Oracle 开源的一款通用虚拟机产品,官方称之为 Universal GraalVM,是新一代的通用多语言高性能虚拟机。它可以运行多种编程语言,如Java、JavaScript、Python等,并提供了即时编译(JIT)和AOT编译(AOT)的支持。GraalVM还支持在不同语言之间互相调用,以及嵌入到其他应用程序中使用。这使得GraalVM成为一个非常强大和灵活的工具,可以满足不同应用场景的需求。\n
                                
                                
                                
                二、GraalVM有哪些特点?
                2.1、高性能
                GraalVM的即时编译器采用了新型的JIT技术,能够在运行时对代码进行优化,从而提高应用程序的性能。同时,GraalVM还支持AOT编译,能够将代码预先编译成本地机器代码,进一步提高应用程序的运行速度。\n
                                
                2.2、多语言支持
                GraalVM支持多种编程语言,如Java、JavaScript、Python等,甚至还支持R、Ruby、C等语言。这意味着开发者可以使用他们最喜欢的语言来开发应用程序,同时还可以将不同语言的代码集成在一起。\n
                                
                2.3、互操作性
                GraalVM允许不同语言之间互相调用,甚至可以将代码嵌入到其他应用程序中。这使得开发者可以选择最适合他们需求的编程语言,并且不需要为了使用不同的语言而进行大量的代码转换。\n
                                
                2.4、安全性
                GraalVM的安全性是由于其特有的“沙箱”机制。这个机制允许开发者在GraalVM上运行不受信任的代码,而不会影响到系统的其他部分。这种机制可以防止恶意代码的传播,从而保证系统的安全性。\n
                                
                三、GraalVM的应用效果
                GraalVM的应用效果非常显著,尤其在大规模、复杂的应用程序中。以下是GraalVM的一些应用效果:\n
                                
                3.1、提高性能
                GraalVM的即时编译器和AOT编译器可以显著提高应用程序的性能。据测试,GraalVM的性能可以比传统的JVM高出20%-100%。\n
                                
                3.2、简化开发
                GraalVM的多语言支持和互操作性可以大大简化开发工作。开发者可以使用他们最熟悉的语言来开发应用程序,并且不需要进行大量的代码转换和集成工作。\n
                                
                3.3、降低成本
                GraalVM的性能提升和简化开发的特性,可以帮助企业在开发过程中减少人力资源和时间成本,同时提高开发效率。\n
                                
                3.4、节省资源
                GraalVM采用了高效的内存管理技术,可以在运行时动态调整内存大小。这意味着应用程序可以更好地利用系统资源,从而提高整体性能。\n
                  
                                
                3.5、支持云环境
                GraalVM的云支持使得它可以在云环境中运行,这意味着开发者可以将应用程序轻松迁移到云上,并且能够利用云环境的弹性扩展和负载均衡等特性。
                """;
    }
}

3.application.properties类

application.properties 属性配置文件放在resources目录下

server.port=8082
spring.thymeleaf.cache=false
4.模板文件类
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>GraalVM & SpringBoot</title>
</head>
<body>
<img src="/image/graalvm-logo.png">

<img src="/image/graalvm_rabbit_icon.svg">

<h1>Hello GraalVM & SpringBoot !</h1>

<ul>
    <li><a href="/">/</a></li>
    <li><a href="/hello/Hello GraalVM & SpringBoot">/hello/GraalVM</a></li>
    <li><a href="/info/graalvmInfo">graalvmInfo</a></li>
</ul>

<!-- Scripts -->
<script>
    var autoclose = getUrlParam("autoclose");
    if (autoclose) {
        checkIfServerIsDown();
    }

    // 检查服务器是否关闭,如果关闭则自动关闭当前页签
    function checkIfServerIsDown() {
        setInterval(function () {
            var xhr = new XMLHttpRequest();
            xhr.open('GET', "/", true);
            xhr.onreadystatechange = function () {
                if (xhr.readyState === 4 && xhr.status === 200 || xhr.status === 304) {
                    var data = xhr.responseText;
                }
            };
            xhr.onerror = function (e) {
                open(location, '_self').close();
            };
            xhr.send();
        }, 1000);
    }

    // 获取网址参数
    function getUrlParam (name) {
        var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
        var r = window.location.search.substr(1).match(reg);
        if (r != null) return unescape(r[2]); return null;
    }
</script>
</body>
</html>

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/480771.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux设备驱动开发 - 三色LED呼吸灯分析

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 展锐UIS7885呼吸灯介绍呼吸灯调试方法亮蓝灯亮红灯亮绿灯展锐UIS7885呼吸灯DTS配置ump9620 PMIC驱动ump9620中的LED呼吸灯驱动LED的tr…

python--容器、列表

1.python官方内置的容器 list: set: tuple: dict: 弱数据类语言通通没有数组&#xff0c;因为数组指的是 类型固定、大小固定、连续的内存空间。 2.链表&#xff1a; 非连续内存空间 python用的是双向链表 单向链表&#xff1a;优点&#xff1a;不浪费内存&#xf…

代码随想录day28(1)二叉树:二叉搜索树中的插入操作(leetcode701)

题目要求&#xff1a;给定二叉搜索树&#xff08;BST&#xff09;的根节点和要插入树中的值&#xff0c;将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据保证&#xff0c;新值和原始二叉搜索树中的任意节点值都不同。 思路&#xff1a;对于二叉搜索树来说&…

如何使用ospf (enps) 简单实践ospf协议

1. OSPF的基本概念 OSPF&#xff08;Open Shortest Path First&#xff0c;开放式最短路径优先&#xff09;是一种广泛应用于TCP/IP网络中的内部网关协议&#xff08;Interior Gateway Protocol, IGP&#xff09;&#xff0c;主要用于在同一自治系统&#xff08;Autonomous Sys…

SpringBoot项目集成XXL-job

文章目录 首先引入依赖配置信息配置类定义定时任务执行方法配置任务执行器配置任务执行计划 在集成 XXL-job 前,首先确保部署了 XXL-job 的 admin 服务, 如果还没有部署的话请参照 Docker安装部署XXL-Job 将 XXL-job 部署起来. 此时, XXL-job 已经部署好了, 下来一步一步的来集…

【Python 滑块不同的操作】对滑块进行处理,列如切割、还原、去除、无脑识别距离等等

文章日期&#xff1a;2024.03.23 使用工具&#xff1a;Python 类型&#xff1a;图片滑块验证的处理&#xff08;不限于识别距离&#xff09; 使用场景&#xff1a;&#xff1f; 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 AES解密处理&a…

BGP4+简介

定义 BGP是一种用于自治系统AS&#xff08;Autonomous System&#xff09;之间的动态路由协议&#xff0c;常用版本是BGP-4&#xff0c;BGP-4只能传递IPv4路由。针对IPv6的BGP4扩展&#xff0c;通常称为BGP4。 目的 BGP4用于在AS之间传递路由信息&#xff0c;并不是所有情况…

Python爬取歌曲宝音乐:轻松下载Jay的歌

歌曲宝是一个不用付费就能听jay的歌曲&#xff0c;但是每次都只能播放一首不方便&#xff0c;于是今天想把它下载下来&#xff0c;本地循环播放&#xff0c;它所用到的接口是某我的还不错哈 获取搜索接口 分析html请求接口&#xff0c;获取到的数据是直接渲染好的HTML内容&…

lvs+keepalived+nginx实现高可用

主机&#xff1a;192.168.199.132 备机&#xff1a;192.168.199.133 真实服务器1&#xff1a;192.168.199.134 真实服务器2&#xff1a;192.168.199.135 问题&#xff1a; 防火墙没关 132配置ipvsadm进行dr模式 132配置keepalived.conf 133配置ipvsadm进行dr模式 133配置ke…

【测试开发学习历程】计算机编程语言

前言&#xff1a; 学习完数据库&#xff0c;我们便要进入到编程语言的内容当中了。 这里先对编程语言写出大致的分类&#xff0c; 在这之后&#xff0c;我们会以Python为重点&#xff0c; 开始测试开发为重点的编程语言学习。 目录 1 计算机编程语言的发展 2 语言的分类…

高蛋白的猫粮品牌有哪些?

亲爱的猫友们&#xff0c;你们是否也在寻找一款高蛋白的猫粮&#xff0c;希望给自家的小猫咪提供最好的营养呢&#xff1f;&#x1f431; 在市面上&#xff0c;高蛋白的猫粮品牌确实不少&#xff0c;但要说到真正让人信赖的&#xff0c;福派斯鲜肉无谷猫粮无疑是一个不错的选择…

如何自己构建 Ollama 模型

如何自己构建 Ollama 模型 0. 引言1. 下载原始模型2. 创建 Modelfile 文件3. 构建 Ollama 模型4. 运行自构建的 Ollama 模型 0. 引言 针对模型新出的大模型&#xff0c;可能 Ollama Models Library 不提供&#xff0c;或者会在今后的某个时点提供。还有可能 Ollama Models Lib…

计算机视觉之三维重建(3)---单视几何

文章目录 一、问题提出二、无穷远点、无穷远线、无穷远平面2.1 2D空间2.2 3D空间 三、影消点和影消线3.1 2D平面上的无穷远点&#xff0c;无穷远线变换3.2 影消点3.3 影消线 四、单视重构 一、问题提出 1. 当摄像机标定后&#xff0c;内部参数 K K K 已知&#xff0c;外部参数…

R语言逻辑回归与lasso模型

一、数据描述 数据集heart_learning.csv与heart_test.csv是关于心脏病的数据集&#xff0c;heart_learning.csv是训练数据集&#xff0c;heart_test.csv是测试数据集。 变量名称变量说明age年龄sex性别&#xff0c;取值1代表男性&#xff0c;0代表女性pain 胸痛的类型&#x…

去中心化的 AI 数据供应:认识Grass,参与Grass

去中心化的 AI 数据供应&#xff1a;认识Grass&#xff0c;参与Grass &#x1f44b;&#xff1a;邀请链接☘️&#xff1a;Intro❓&#xff1a;看好Grass和即将推出的L2的原因有哪些&#xff1f;&#x1f4a1;&#xff1a;展望&#x1f50d;&#xff1a;总结 &#x1f44b;&…

Ubuntu 安装GPU驱动

https://www.nvidia.cn/Download/index.aspx 驱动我前面安装好啦&#xff0c;不做了&#xff0c;不过可以去看看 CUDA Toolkit 12.4 Downloads | NVIDIA Developer wget https://developer.download.nvidia.com/compute/cuda/12.4.0/local_installers/cuda_12.4.0_550.54.14_l…

【CXL协议-事务层之CXL.io(3)】

3.1 CXL.io CXL.io 为 I/O 设备提供非一致的加载/存储接口。 图 14 显示了 CXL.io 事务层在 Flex Bus 分层结构中的位置。 交易类型、交易数据包格式、基于信用的流量控制、虚拟通道管理和交易排序规则遵循PCIe定义&#xff1b; 请参阅 有关详细信息&#xff0c;请参阅 PCI Ex…

一文读懂多模态大模型:原理、应用与挑战全解析

在这个信息交织、五彩斑斓的时代&#xff0c;文字、图像、视频和音频如同四条蜿蜒曲折的河流&#xff0c;各自流淌&#xff0c;却又相互交织。它们构成了我们数字生活的核心元素&#xff0c;每一天&#xff0c;我们都在与之亲密接触。然而&#xff0c;面对这些形态各异的信息流…

(附源码)基于Spring Boot + Vue 在线网课学习系统的设计与实现

前言 &#x1f497;博主介绍&#xff1a;✌专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅&#x1f447;&#x1f3fb; 2024年Java精品实战案例《100套》 &#x1f345;文末获取源码联系&#x1f345; &#x1f31…

政安晨:【深度学习实践】【使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络】(六)—— 二元分类

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 这篇文章咱们将深度学习应用到另一个常见任务中。 前言 在…