SpringBoot3+graalvm:整合并打包为可执行文件

原文网址:SpringBoot3+graalvm:整合并打包为可执行文件-CSDN博客

简介

本文介绍SpringBoot3如何整合graalvm,并打包为可执行文件。Windows和Linux都打包。

版本

springboot3.3.6

graalvm21(包含JDK21(21是最新的LTS版本,SpringBoot3最低要求JDK17))

安装graalvm

1.下载

官网:https://www.graalvm.org/

进去后点击下载,即可找到:

下载后得到此文件:graalvm-jdk-21_windows-x64_bin.zip

(JDK21不需要下载native-image了,因为已经捆绑到bin目录了。直接在bin目录下cmd输入native-image即可)

2.安装 

将graalvm-jdk-21_windows-x64_bin.zip解压到指定目录,我这里解压到:E:\work\develop_env\graalvm\graalvm-jdk-21_windows-x64_bin

把JDK环境变量配置为GraalVM的路径(因为GraalVM就是JDK)。

由于我要同时用JDK8和JDK21,所以要配置一下,见:Windows使用多个JDK的方法-CSDN博客

创建SpringBoot项目

跟原来SpringBoot2的项目结构是一样的。

依赖及代码

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.3.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.knife</groupId>
    <artifactId>Demo_SpringBoot3</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Demo_SpringBoot3</name>
    <description>Demo project for Spring Boot3</description>

    <properties>
        <java.version>21</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!-- AOT Graalvm 插件 -->
            <plugin>
                <groupId>org.graalvm.buildtools</groupId>
                <artifactId>native-maven-plugin</artifactId>
            </plugin>

            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <!-- <version>3.5.1</version> -->
                <!-- 指定maven编译的jdk版本。对于JDK8,写成8或者1.8都可以 -->
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

Controller

package com.knife.example.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RequestMapping("test")
@RestController
public class HelloController {

    @GetMapping("test1")
    public String test1() {
        return "success";
    }
}

启动与测试

启动

Connected to the target VM, address: '127.0.0.1:52251', transport: 'socket'

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/

 :: Spring Boot ::                (v3.3.6)

2024-11-29T15:09:52.849+08:00  INFO 43480 --- [           main] com.knife.example.DemoApplication        : Starting DemoApplication using Java 21.0.5 with PID 43480 (E:\project\Idea_Proj\Demo_Java\Demo_SpringBoot3\target\classes started by aaabbb in E:\project\Idea_Proj\Demo_Java\Demo_SpringBoot3)
2024-11-29T15:09:52.852+08:00  INFO 43480 --- [           main] com.knife.example.DemoApplication        : No active profile set, falling back to 1 default profile: "default"
2024-11-29T15:09:53.549+08:00  INFO 43480 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port 8080 (http)
2024-11-29T15:09:53.561+08:00  INFO 43480 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2024-11-29T15:09:53.562+08:00  INFO 43480 --- [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.33]
2024-11-29T15:09:53.612+08:00  INFO 43480 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2024-11-29T15:09:53.613+08:00  INFO 43480 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 715 ms
2024-11-29T15:09:53.925+08:00  INFO 43480 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 8080 (http) with context path '/'
2024-11-29T15:09:53.933+08:00  INFO 43480 --- [           main] com.knife.example.DemoApplication        : Started DemoApplication in 1.439 seconds (process running for 2.028)
2024-11-29T15:09:56.814+08:00  INFO 43480 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2024-11-29T15:09:56.814+08:00  INFO 43480 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2024-11-29T15:09:56.815+08:00  INFO 43480 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms

测试接口

访问:http://localhost:8080/test/test1

结果:

打包为可执行文件(Windows的.exe)

从上边来看,好像与SpringBoot2没啥区别。但SpringBoot3有一个重要改动:可以打包为可执行文件,比如:Windows的.exe文件,可以直接执行。性能强、启动快、占内存低。

下边就实战一下打包为可执行文件。

1.下载Visual Studio组件

Windows使用native-image 打包需要C++环境,VisualStudio 可以提供c++开发环境,所以我们要先下载安装好VisualStudio。

必须安装VisualStudio组件,否则在下边mvn -Pnative native:compile时会报错:

Error: Failed to find 'vcvarsall.bat' in a Visual Studio installation.
Please make sure that Visual Studio 2022 version 17.1.0 or later is installed on your system. You can download it at https://visualstudio.microsoft.com/downloads/. If this error persists, please try and run GraalVM Native Image in an x64 Native Tools Command Prompt or file a ticket.

下载

地址:https://visualstudio.microsoft.com/zh-hans/

进去后点击这里:

点击完后,会自动下载VisualStudioSetup.exe 

2.安装Visual Studio组件

双击VisualStudioSetup.exe,点击继续,然后到如下界面:

选择正确版本的SDK

运行cmd,输入VER并回车,即可得到版本,找最接近的即可。

选择英文语言包

修改安装位置:

注意:记住这个位置,后边要用。

最后点击安装:

正在安装:

安装完成

如果上边有操作错误,可以点击修改:

删除无用的安装包,之前选定了下载缓存,把它删掉,我的目录是:

D:\ProgramData\Microsoft\VisualStudio\Packages

3.配置环境变量

配置VS环境变量

1.新建VISUAL_STUDIO系统变量

指定到自己的VS路径

2.Path添加VISUAL_STUDIO的bin路径

即:%VISUAL_STUDIO%\VC\Tools\MSVC\14.42.34433\bin\Hostx64\x64

3. 添加INCLUDE环境变量

我上边设置的套件安装位置是:E:\work\develop_env\visual_studio,Windows Kits自动安装到了这里:E:\Windows Kits。为统一管理,我把E:\Windows Kits复制到E:\work\develop_env\visual_studio\下边。

(如果没改过路径,那会在这个路径下:C:\Program Files (x86)\Windows Kits\)

然后添加环境变量:

%VISUAL_STUDIO%\VC\Tools\MSVC\14.42.34433\include;E:\work\develop_env\visual_studio\Windows Kits\10\Include\10.0.19041.0\shared;E:\work\develop_env\visual_studio\Windows Kits\10\Include\10.0.19041.0\ucrt;E:\work\develop_env\visual_studio\Windows Kits\10\Include\10.0.19041.0\um;E:\work\develop_env\visual_studio\Windows Kits\10\Include\10.0.19041.0\winrt

即:

4.添加lib环境变量

与上边INCLUDE类似。添加lib环境变量,值为:

%VISUAL_STUDIO%\VC\Tools\MSVC\14.42.34433\lib\x64;E:\work\develop_env\visual_studio\Windows Kits\10\Lib\10.0.19041.0\ucrt\x64;E:\work\develop_env\visual_studio\Windows Kits\10\Lib\10.0.19041.0\um\x64

即:

4.打包

打包的步骤如下。

mvn clean
mvn compile
mvn spring-boot:process-aot
mvn -Pnative native:compile

第四步才会生成.jar和.exe文件。

以上四个步骤,可以在Idea里运行(但是必须在上一步配置完环境变量后,重启Idea,否则环境变量不生效!):

结果:

主要步骤

[1/8] Initializing...
[2/8] Performing analysis...
[3/8] Building universe...
[4/8] Parsing methods...
[5/8] Inlining methods...
[6/8] Compiling methods...
[7/8] Layouting methods...
[8/8] Creating image...

看结果文件:

对比一下jar和exe大小:(.exe文件竟然是.jar的四倍)

备注

有人说必须用官方命令行工具,不能用Idea等,其实是因为配置完环境变量后没有重启Idea,导致没编译成功。

官方虽然有说明:

但是,只要重启Idea,就能直接用Idea去通过点击直接操作!

5.运行.exe

直接双击Demo_SpringBoot3.exe即可运行:

测试一下它的接口:(成功访问)

6.对比内存占用 

先看上边.exe的内存占用:

把它关掉,运行一下jar看一下 

可见,单纯看.exe和.jar的内存占用的话:

.exe:29MB

.jar:154MB

打包为可执行文件(Linux)

目标:打包为Ubuntu的可执行文件,本处我的Ubuntu版本:2022.04.04,x86_64架构。

备注:无法在Windows下交叉编译,只能到Linux里直接编译。

1.下载graalvm(Linux版)

官网:https://www.graalvm.org/

进去后点击下载,即可找到:

我的Ubuntu是x86_64,所以下载这个:

下载后得到此文件:graalvm-jdk-21_linux-x64_bin.tar.gz

(JDK21不需要下载native-image了,因为已经捆绑到bin目录了)

2.配置Ubuntu宿主机环境变量

将上边文件上传到Ubuntu宿主机,这里我上传到此路径:/work/env/graalvm/

解压一下:

tar xf graalvm-jdk-21_linux-x64_bin.tar.gz

解压之后:

执行两条命令:

export JAVA_HOME=/work/env/graalvm/graalvm-jdk-21.0.5+9.1
export PATH=$PATH:$JAVA_HOME/bin

执行一下java看看:

3.用Docker搭建maven

见:Docker Compose--安装本地maven-CSDN博客

4.Maven容器配置环境变量

将graalvm复制到maven容器路径:这里我复制到:/work/env/maven/tool/graalvm/

执行两条命令:

export JAVA_HOME=/tool/graalvm/graalvm-jdk-21.0.5+9.1
export PATH=$PATH:$JAVA_HOME/bin

验证Java版本:java -version

验证native-image:native-image --version

5.Maven容器安装编译工具

apt update
apt install build-essential libz-dev zlib1g-dev

native-image要用到二进制编译工具,所以要安装编译工具。 

6.Maven容器打包 

将项目上传到Linux服务器,然后把它打包为二进制文件。

先把项目打包:tar czf Demo_SpringBoot3.tar.gz Demo_SpringBoot3/

我直接用Windows下的git bash工具:

把Demo_SpringBoot3.tar.gz上传到Linux服务器。

我放到此目录:/work/env/maven/app。将其解压:

tar xf Demo_SpringBoot3.tar.gz

结果:

进入maven容器

docker exec -it maven_3.9 bash

进入/app/Demo_SpringBoot3执行打包命令:

mvn clean
mvn compile
mvn spring-boot:process-aot
mvn -Pnative native:compile

结果(用的虚拟机,运行有点慢,用了十几分钟):

7.运行可执行文件

进入宿主机,进入target目录:/work/env/maven/app/Demo_SpringBoot3/target

执行:./Demo_SpringBoot3

访问: http://192.168.5.193:8080/test/test1

成功! 

8.对比内存占用 

看二进制执行时的占用:

关掉它,执行一下.jar试试

可见,物理内存占用:

二进制:80m

.jar:169m

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

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

相关文章

【Bolt.new + PromptCoder】三分钟还原油管主页

【Bolt.new PromptCoder】三分钟还原油管主页 PromptCoder官网&#xff1a;PromptCoder Bolt官网&#xff1a;https://bolt.new/ Bolt 是什么&#xff1f; Bolt.new 是一个提供创建全栈网络应用服务的平台。它允许用户通过提示&#xff08;Prompt&#xff09;、运行&#x…

ubuntu下anconda装pytorch

1、禁用nouveau sudo vim /etc/modprobe.d/blacklist.conf 在文件最后部分插入以下两行内容 blacklist nouveau options nouveau modeset0 更新系统 sudo update-initramfs -u 重启系统 2、装nvidia驱动 卸载原来驱动 sudo apt-get remove nvidia-* &#xff08;若安装…

QT数据库(四):QSqlRelationalTableModel 类

关系数据库概念 例如下列departments、majors、studInfo 这 3 个数据表之间存在关系。 主键与外键 标记“**”的是主键字段&#xff0c;标记“*”的是外键字段。主键字段是一个数据表中表示记录唯一性的字段&#xff0c;例如 studInfo 数据表中的 studID 字段。外键字段是与其…

【Linux】-学习笔记10

第八章、Linux下的火墙管理及优化 1.什么是防火墙 从功能角度来讲 防火墙是位于内部网和外部网之间的屏障&#xff0c;它按照系统管理员预先定义好的规则来控制数据包的进出 从功能实现角度来讲 火墙是系统内核上的一个模块netfilter(数据包过滤机制) …

SpringBoot 手动实现动态切换数据源 DynamicSource (中)

大家好&#xff0c;我是此林。 SpringBoot 手动实现动态切换数据源 DynamicSource &#xff08;上&#xff09;-CSDN博客 在上一篇博客中&#xff0c;我带大家手动实现了一个简易版的数据源切换实现&#xff0c;方便大家理解数据源切换的原理。今天我们来介绍一个开源的数据源…

Crawl4AI:一个为大型语言模型(LLM)和AI应用设计的网页爬虫和数据提取工具实战

这里写目录标题 一、crawl4AI功能及简介1、简介2、特性 二、项目地址三、环境安装四、大模型申请五、代码示例1.生成markdown2.结构化数据 一、crawl4AI功能及简介 1、简介 Crawl4AI 是一个开源的网页爬虫和数据抓取工具&#xff0c;一个python项目&#xff0c;主要为大型语言…

【银河麒麟高级服务器操作系统】有关dd及cp测试差异的现象分析详解

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn dd现象 使用银河麒麟高级服务器操作系统执行两次…

sqli-labs靶场第26-30关

第26关 这关将逻辑运算符&#xff0c;注释符以及空格给过滤了 我们先使用单引号进行闭合 这时我们查看源代码可以看到这一关过滤了很多字符 可以看到这里将or and / -- # 空格等字符都被注释了 空格被过滤了我们可以使用()来代替&#xff0c;and和or可以使用双写来绕过 因为…

ik分词器了解 和 通过zip安装包的方式 将ik分词器安装到elasticsearch中

目录 1. ik分词器的作用&#xff08;效果&#xff09; &#xff08;1&#xff09;标准分析器效果 &#xff08;2&#xff09;ik_smart分词 &#xff08;3&#xff09;ik_max_word分词 2. 首先根据自己的elasticsearch的版本下载对应的ik分词器版本 3. 将下载好的ik分词器…

实景视频与模型叠加融合?

[视频GIS系列]无人机视频与与实景模型进行实时融合_无人机视频融合-CSDN博客文章浏览阅读1.5k次&#xff0c;点赞28次&#xff0c;收藏14次。将无人机视频与实景模型进行实时融合是一个涉及多个技术领域的复杂过程&#xff0c;主要包括无人机视频采集、实景模型构建、视频与模型…

【解决】k8s使用kubeadm初始化集群失败问题整理

执行提示命令&#xff0c;查看报错信息 journalctl -xeu kubelet1、错误&#xff1a;running with swap on is no 报错 "command failed" err"failed to run Kubelet: running with swap on is no 解决&#xff1a; swap未禁用&#xff0c;需要禁用swap&…

aws(学习笔记第十七课) SQS Amazon Simple Queue Service服务

aws(学习笔记第十七课) SQS Amazon Simple Queue Service服务 学习内容&#xff1a; 使用SQS Amazon Simple Queue Service服务整体代码&#xff08;nodejs的通常工程&#xff09;代码动作 1. 使用SQS Amazon Simple Queue Service服务 利用应用程序来学习SQS 创建S3$ aws s…

qt-C++笔记之父类窗口、父类控件、对象树的关系

qt-C笔记之父类窗口、父类控件、对象树的关系 code review! 参考笔记 1.qt-C笔记之父类窗口、父类控件、对象树的关系 2.qt-C笔记之继承自 QWidget和继承自QObject 并通过 getWidget() 显示窗口或控件时的区别和原理 3.qt-C笔记之自定义类继承自 QObject 与 QWidget 及开发方式…

VMware ubuntu12.04怎么设置静态IP联网

记得刚开始学习嵌入式就是从ubuntu12.04的环境开始学习的C语言&#xff0c;当时没有弄清楚怎么设置静态IP联网&#xff0c;现在写一篇文章。 1.首先&#xff0c;关闭ubuntu的网络&#xff1b; 2.电脑使用的是wifi,将VMware桥接到该网卡上&#xff1b; 3.在虚拟机设置里面选择桥…

计算机视觉中的图像滤波与增强算法

摘要&#xff1a; 本文深入探讨了计算机视觉领域中的图像滤波与增强算法。首先介绍了图像滤波与增强的基本概念和重要性&#xff0c;随后详细阐述了线性滤波算法中的均值滤波和高斯滤波&#xff0c;以及非线性滤波算法中的中值滤波和双边滤波&#xff0c;包括它们的原理、数学模…

AI大模型学习笔记|神经网络与注意力机制(逐行解读)

来源分享链接&#xff1a;通过网盘分享的文件&#xff1a;详解神经网络是如何训练的 链接: https://pan.baidu.com/s/12EF7y0vJfH5x6X-0QEVezg 提取码: k924 内容摘要&#xff1a;本文深入探讨了神经网络与注意力机制的基础&#xff0c;以及神经网络参数训练的过程。以鸢尾花数…

腾讯云系统盘扩容

在腾讯云申请空间后&#xff0c;只要执行三行命令 云硬盘 在线扩展系统盘分区及文件系统-操作指南-文档中心-腾讯云 安装工具 yum install -y cloud-utils-growpart 给/eav/vda1扩分区 LC_ALLen_US.UTF-8 growpart /dev/vda 1 挂载扩容 ext4 文件系统 resize2fs /dev/vda1 …

【控制系统】深入理解反步控制(Backstepping) | 反步法控制器原理与应用实例解析(附Matlab/Simulink仿真实现)

&#x1f4af; 欢迎光临清流君的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落 &#x1f4af; &#x1f525; 个人主页:【清流君】&#x1f525; &#x1f4da; 系列专栏: 运动控制 | 决策规划 | 机器人数值优化 &#x1f4da; &#x1f31f;始终保持好奇心&…

构建树莓派温湿度监测系统:从硬件到软件的完整指南

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

人工智能系统

介绍人工智能 的基础书 点击这里 1.1 深度学习的历史&#xff0c;现状与发展 本章将介绍深度学习的由来&#xff0c;现状和趋势&#xff0c;让读者能够了解人工智能系统之上的深度学习负载的由来与趋势&#xff0c;为后面理解深度学习系统的设计和权衡形成初步的基础。我们在后…