GreaalVM编译springboot编译springboot

news2025/1/10 21:12:12

GreaalVM编译springboot编译springboot

原文转自:https://lingkang.top/archives/greaalvm%E7%BC%96%E8%AF%91springboot

https://lingkang.top/archives/greaalvm%E7%BC%96%E8%AF%91springboot

window下使用GreaalVM编译springboot存在很多坑,主要是配置MSVC

可以参考spring官网:https://docs.spring.io/spring-native/docs/0.12.1/reference/htmlsingle/#_build_the_native_application_2

下载GreaalVM

下载GreaalVM地址:https://github.com/graalvm/graalvm-ce-builds/releases
2022年11月20日最新版22.3.0,所属的openjdk版本是17.0.5
解压到C:\Program Files\graalvm-ce-java17-22.3.0
配置它到环境变量:(替换原jdk环境变量)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k1jZs0aa-1668900865618)(/upload/2022/11/image-1668899567832.png)]

version
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZAoXRcJE-1668900865620)(/upload/2022/11/image-1668899599488.png)]

安装编译工具

gu install native-image

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xF1oqwjl-1668900865620)(/upload/2022/11/image-1668900176637.png)]
我已经安装好了
在这里插入图片描述

创建springboot项目

springboot项目是2.7.5,使用IDEA创建springboot项目,删除测试文件。注意某些依赖无法打包源生
Maven如下:

<?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>2.7.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>top.lingkang</groupId>
    <artifactId>graalvm-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>graalvm-demo</name>
    <description>graalvm-demo</description>
    <properties>
        <java.version>17</java.version>
        <repackage.classifier/>
        <spring-native.version>0.12.1</spring-native.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.experimental</groupId>
            <artifactId>spring-native</artifactId>
            <version>${spring-native.version}</version>
        </dependency>

        <!--<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>-->
        <!--<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>-->
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                    <classifier>${repackage.classifier}</classifier>
                    <image>
                        <builder>paketobuildpacks/builder:tiny</builder>
                        <env>
                            <BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE>
                        </env>
                    </image>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.experimental</groupId>
                <artifactId>spring-aot-maven-plugin</artifactId>
                <version>${spring-native.version}</version>
                <executions>
                    <execution>
                        <id>test-generate</id>
                        <goals>
                            <goal>test-generate</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>generate</id>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    <repositories>
        <repository>
            <id>spring-releases</id>
            <name>Spring Releases</name>
            <url>https://repo.spring.io/release</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>spring-releases</id>
            <name>Spring Releases</name>
            <url>https://repo.spring.io/release</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>

    <profiles>
        <profile>
            <id>native</id>
            <properties>
                <repackage.classifier>exec</repackage.classifier>
                <native-buildtools.version>0.9.13</native-buildtools.version>
            </properties>
            <dependencies>
                <dependency>
                    <groupId>org.junit.platform</groupId>
                    <artifactId>junit-platform-launcher</artifactId>
                    <scope>test</scope>
                </dependency>
            </dependencies>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.graalvm.buildtools</groupId>
                        <artifactId>native-maven-plugin</artifactId>
                        <version>${native-buildtools.version}</version>
                        <extensions>true</extensions>
                        <executions>
                            <execution>
                                <id>test-native</id>
                                <phase>test</phase>
                                <goals>
                                    <goal>test</goal>
                                </goals>
                            </execution>
                            <execution>
                                <id>build-native</id>
                                <phase>package</phase>
                                <goals>
                                    <goal>build</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>

</project>

编写一个controller

package top.lingkang.graalvmdemo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author lingkang
 * Created by 2022/11/20
 */
@RestController
public class WebController {
    private SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    @GetMapping("/")
    public Object index(){
        return "hi, "+format.format(new Date());
    }
}

运行项目无任何报错

GreaalVM打包

在window下,打包钱需要配置MSVC。
我电脑中已经下载了 Visual Studio 2022 并且已经安装了最新的MSVC
在这里插入图片描述

接下来配置MSVC

配置MSVC

找到MSVC的安装目录,我的被VS安装到了 C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.31.31103

配置LIB环境变量

C:\Users\Administrator>echo %LIB%
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\um\x64;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\ucrt\x64;C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.31.31103\bin\Hostx64\x64;C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.31.31103\lib\x64;

你可以复制替换系统版本和MSVC位置

其中10.0.19041.0为你的window版本,可以去到对应路径C:\Program Files (x86)\Windows Kits\10中查找

配置INCLUDE环境变量

C:\Users\Administrator>echo %INCLUDE%
C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\ucrt;C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um;C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\shared;C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.31.31103\include

你可以复制替换系统版本和MSVC位置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2P8702MF-1668900865623)(/upload/2022/11/image-1668899880117.png)]
在这里插入图片描述

编译打包springboot项目

执行打包命令

mvn -Pnative -DskipTests package

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4OOMjRiD-1668900865623)(/upload/2022/11/image-1668899963838.png)]

打包期间发现电脑有些卡,等待几分钟
打包成功:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0mrPbazt-1668900865624)(/upload/2022/11/image-1668900016493.png)]

不过大小是不是太大了?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OFc4EzUk-1668900865624)(/upload/2022/11/image-1668900067384.png)]

运行效果与内存

打包后运行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fqI5U0Wf-1668900865624)(/upload/2022/11/image-1668900351467.png)]

对比未打包运行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tl5ZDSed-1668900865625)(/upload/2022/11/image-1668900453723.png)]
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IfcOpenShell - Python 2022最新安装步骤 兼谈IFC的理解与认识

前言 我之前2020年写了一个IfcOpenShell - Python的安装教程&#xff0c;相信不少对IFC感兴趣的朋友已经看过。两年多以后发生了很多事情&#xff0c;我的工作重心也不再是IFC IFCXML。目前我对IFC的理解就是“底层数据库”&#xff0c;以他为数据库我可以做很多尝试&#xff…

P1113 杂务

分析:可以把每个任务看成都一个节点,如果有2个任务a,b,如果a是b的准备工作,那么就在a,b之间连一条有向边。由于互相没有关系的杂务可以同时工作,所以发现所有杂务都被完成的最短时间取决与最晚被完成的那个任务&#xff0c;于是需要找到最晚被完成任务的时间。 因为题目中有一…

万字详解C++避坑指南总结

前言 C是一门古老的语言&#xff0c;但仍然在不间断更新中&#xff0c;不断引用新特性。但与此同时C又甩不掉巨大的历史包袱&#xff0c;并且C的设计初衷和理念造成了C异常复杂&#xff0c;还出现了很多不合理的“缺陷”。 本文主要有3个目的&#xff1a; 1. 总结一些C晦涩难懂…

[计算机毕业设计]聚类分析算法

前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着准备考研,考公,考教资或者实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过…

this 的五种绑定方式(默认 / 隐式 / 显式 / new 构造函数 / 箭头函数)

目录 1. this 的五种绑定方式 1.1 默认绑定 1.1.1 基本概念 1.1.2 严格模式下的默认绑定 1.1.3 let、const、var 变量的默认绑定 1.1.4 函数作用域中的 this 指向 1.2 隐式绑定 1.2.1 关于 this 指向最后调用函数的那个对象&#xff0c;该怎么理解&#xff1f; 1.2.2 …

Hive三种模式安装部署

文章目录1. 内嵌模式安装2. 本地模式安装2.1 Mysql安装2.2 Hive安装配置3. 远程模式安装1. 内嵌模式安装 安装准备 下载hive&#xff1a;pass将文件复制到安装目录下&#xff1a; 解压安装包&#xff1a;tar zxvf apache-hive-3.1.2-bin.tar.gz修改名字&#xff1a;mv apache-h…

【序列召回推荐】(task3)GNN召回之SR-GNN

note 关于图深度学习算法的简单回顾&#xff1a; 一开始是经典的word2vec&#xff08;以skip-gram为例&#xff0c;先取周围词随机初始化的embedding&#xff0c;进行平均池化后与中心词embedding进行点积&#xff09;通过周围词预测中心词&#xff08;多分类任务&#xff09;…

(4)paddle---PCB检测的例子

1、主要参考 &#xff08;1&#xff09;大佬教程 基于PaddleDetection的PCB瑕疵检测_AI Studio的博客-CSDN博客 &#xff08;2&#xff09;blibli视频 253-14_PCB电路板缺陷检测_项目配置文件_dec_哔哩哔哩_bilibili &#xff08;3&#xff09;coco数据集说明 『深度应用…

(最新+详细+Pycharm远程调试GUI程序)解决qt.qpa.xcb: could not connect to display问题

&#xff08;最新详细Pycharm远程调试GUI程序&#xff09;解决qt.qpa.xcb: could not connect to display问题出现原因解决方法步骤下载MobaXTerm连接服务器安装Xorg和打开X11-forwarding附录设置共享目录修改环境出现原因 在ubuntu服务器上运行cv.imshow()方法时就会报以下错…

java计算机毕业设计ssm贫困区教育资源捐赠平台element vue前后端分离

项目介绍 随着时代的发展,互联网和计算机技术,带动了整个社会的发展,方便了我们的生活。贫困区教育资源捐赠管理平台是使用JAVA的SSM技术,MySQL作为数据库开发,用户通过网站了解贫困区情况,在线帮助贫困人群,实现贫困区教育资源捐赠管理。首先对本论文进行分析后,提出平台的相…

Linux 安装 Nginx

阿里巴巴开源镜像站-OPSX镜像站 阿里云开发者社区&#xff1a;Nginx Linux详细安装部署教程&#xff08;附带使用案例&#xff09; Nginx 下载 1、切换到root用户 2、安装c编译环境&#xff0c;如已安装可略过 yum install gcc-c 3、安装 Nginx 相关依赖 yum -y install…

java基于ssm的奖学金管理系统-计算机毕业设计

项目介绍 1.注册模块&#xff1a;游客用户可以系统进行账号注册&#xff0c;账号注册需要输入的数据&#xff0c;有用户名、密码、确认密码、邮箱、qq等&#xff0c;提交注册信息后&#xff0c;系统通过js代码判断用户输入的注册数据是否符合规格&#xff0c;如果符合规格后&a…

带临床数据的热图 -- 给样品添加TNM分期、年龄、性别、riskscore等信息

聚类热图是生物医学论文中最常见的一类图。通常&#xff0c;一篇研究癌症预后、突变等类型的文章最终都会聚焦到几个或者十几个基因&#xff0c;然后利用这些基因的表达量绘制热图&#xff0c;并尽可能多地在图中展示样品的临床信息&#xff0c;例如TNM&#xff08;Tumor Node …

【Linux】信号

//myproc.cc #include<iostream> #include<unistd.h> using namespace std; int main() {while(1){sleep(1);}return 0; } 信号捕捉 signal #include<iostream> #include<unistd.h> #include<signal.h> using namespace std; void handler(int s…

Mybatis generator实战:自动生成POJO类完整解决方案

目录1、背景&#xff1a;Mybatis generator根据数据库表自动生成POJO类完整解决方案2、解决方案&#xff1a;mybatis generator 1.3.6 已经有了这个功能&#xff0c;2.1、增加了一个新的属性&#xff1a;2.2、具体配置&#xff0c;在generatreConfig.xml, 例如:3、一定要开始看…

训练集表达的分类规则整理

(A&#xff0c;B)---3*30*2---(1,0)(0,1) 做一个网络分类A和B&#xff0c;让A和B的训练集都只有一张图片3个点&#xff0c;测试集为 0 0 0 0 1 0 0 1 2 0 1 0 3 0 1 1 4 1 0 0 5 1 0 1 6 1 1 0 7 1 1 1 二进制的0-7.记录网络随着A和B的改变分类…

LeetCode - 300 最长递增子序列

目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 300. 最长递增子序列 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&…

Windows进程间利用管道通信

实验一 一、实验内容或题目&#xff1a; 在父进程中创建一个子进程&#xff0c;并建立一个管道&#xff0c;子进程向管道中写入一个字符串&#xff0c;父进程从管道中读出字符串。 二、实验目的与要求&#xff1a; 利用CRT相关接口&#xff0c;学习在父子进程间实现管道通信…

酒水商城|基于Springboot实现酒水商城系统

作者主页&#xff1a;编程千纸鹤 作者简介&#xff1a;Java、前端、Pythone开发多年&#xff0c;做过高程&#xff0c;项目经理&#xff0c;架构师 主要内容&#xff1a;Java项目开发、毕业设计开发、面试技术整理、最新技术分享 收藏点赞不迷路 关注作者有好处 项目编号&…

【Java八股文总结】之集合

文章目录Java集合一、集合概述1、List、Set、Queue、Map的区别&#xff1f;2、Collections和Collection的区别&#xff1f;3、集合和数组的区别二、List1、ArrayList和LinkedList的区别&#xff1f;2、ArrayList和Vector的区别3、Vector、ArrayList和LinkedList的区别4、ArrayL…