SpringBoot3之GraalVM之Linux详细安装及使用教程

news2024/11/17 8:19:37

Linux安装底层工具相关依赖

在这里插入图片描述

yum install -y gcc glibc-devel zlib-devel

安装GraalVM JDK

《GraalVM官网下载》
找到最近的GraalVM Community Edition X.X.X点击Assets(因为我的是SpringBoot3项目,起始JDK就要求17,所以我下载17)下载速度慢的话,可以使用第三方下载工具,如:迅雷等
选择如下2个内容下载
graalvm-ce-java17-linux-amd64-X.X.X.tar.gz
native-image-installable-svm-java17-linux-amd64-X.X.X.jar

配置JDK环境变量为GraalVM的环境变量,因为GraalVM就是JDK

如果之前已经有Java的环境变量,则要替换为GraalVM
把文件上传到/usr/local/java/目录下进行解压graalvm-ce-java17-linux-amd64-X.X.X.tar.gz(GraalVM JDK)

mkdir -p /usr/local/java
cd /usr/local/java
tar -zxvf graalvm-ce-java17-linux-amd64-22.3.1.tar.gz

配置环境变量

vim  /etc/profile

找到export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL,在下面写上:

#java
export JAVA_HOME=/usr/local/java/graalvm-ce-java17-22.3.1
export CLASSPATH=.:$JAVA_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin

java17是没有jre/bin目录的,但是为了方便切换到8版本,还是保留吧。想切换到java只需要修改环境变量JAVA_HOME为你java8的安装目录即可。
:wq保存并退出,使环境变量生效

source /etc/profile && java -version

输出

openjdk version "17.0.6" 2023-01-17
OpenJDK Runtime Environment GraalVM CE 22.3.1 (build 17.0.6+10-jvmci-22.3-b13)
OpenJDK 64-Bit Server VM GraalVM CE 22.3.1 (build 17.0.6+10-jvmci-22.3-b13, mixed mode, sharing)

安装GraalVM Native-Image

native-image-installable-svm-java17-linux-amd64-X.X.X.jar上传到/usr/local/java/目录下进行安装

gu install --file native-image-installable-svm-java17-linux-amd64-22.3.1.jar

输入native-image --help看看控制台是否输出相关帮助命令,如果输出,则安装成功。

native-image --help

SpringBoot3

新增spring boot3项目选择JDK为GraalVM JDK17
在这里插入图片描述

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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.fu</groupId>
    <artifactId>spring-boot3-aot-graalvm-native-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!-- 没有跟demo-maven作为父子项目,而是以SpringBoot作为父项目 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.0.5</version>
        <relativePath/>
    </parent>

    <properties>
        <java.version>17</java.version>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

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

    <build>
        <plugins>
            <!-- AOT Graalvm native maven 插件 -->
            <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>
        </plugins>
    </build>
</project>
建个HelloController.java和SpringBootApplication启动类
@RestController
public class HelloController {

    @GetMapping("hello")
    public String hello() {
        return "Hello World.";
    }

}

把SpringBoot3打成jar包上传到linux服务器

native-image -jar springboot3-native-demo.jar

运行过程当中可能会产生一些警告或错误,但是程序是可以正常运行的,因为打成二进制(汇编)需要的是确定的、不可变的类型,而反射、泛型等是动态的类型,如果运行过程当中类型发生改变,则程序就会出错,因此会发出警告。

GraalVM Native Image: Generating 'springboot3-native-demo' (executable)...
========================================================================================================================
[1/7] Initializing...                                                                                    (4.1s @ 0.18GB)
 Version info: 'GraalVM 22.3.1 Java 17 CE'
 Java version info: '17.0.6+10-jvmci-22.3-b13'
 C compiler: gcc (redhat, x86_64, 4.8.5)
 Garbage collector: Serial GC
[2/7] Performing analysis...  [******]                                                                  (19.3s @ 0.61GB)
   3,587 (76.86%) of  4,667 classes reachable
   4,509 (52.77%) of  8,545 fields reachable
  16,135 (45.95%) of 35,113 methods reachable
     160 classes,     0 fields, and   539 methods registered for reflection
      59 classes,    59 fields, and    52 methods registered for JNI access
       4 native libraries: dl, pthread, rt, z
[3/7] Building universe...                                                                               (2.3s @ 0.49GB)

Warning: Reflection method java.lang.Class.forName invoked at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:46)
Warning: Reflection method java.lang.Class.getDeclaredMethod invoked at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:47)
Warning: Reflection method java.lang.Class.getDeclaredConstructor invoked at org.springframework.boot.loader.jar.Handler.getFallbackHandler(Handler.java:200)
Warning: Aborting stand-alone image build due to reflection use without configuration.
Warning: Use -H:+ReportExceptionStackTraces to print stacktrace of underlying exception
------------------------------------------------------------------------------------------------------------------------
                        0.6s (2.4% of total time) in 23 GCs | Peak RSS: 1.07GB | CPU load: 3.41
========================================================================================================================
Failed generating 'springboot3-native-demo' after 25.8s.
Generating fallback image...
Warning: Image 'springboot3-native-demo' is a fallback image that requires a JDK for execution (use --no-fallback to suppress fallback image generatformation why a fallback image was necessary).

打包会生成2个文件,第一个就是二进制可执行文件,第二个是构建工件(可以删除),第三个是jar文件(不能删除)。
在这里插入图片描述

启动/data/graalvm/下的springboot3-native-demo二进制可执行文件

PS:因为我把jar包上传到了/data/graalvm/目录下

/data/graalvm/springboot3-native-demo

输出

[root@node1 graalvm]# ./spring-boot3-aot-graalvm-native-demo-1.0-SNAPSHOT

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.0.5)

2023-07-02T11:18:20.990-04:00  INFO 2500 --- [           main] c.f.s.SpringBoot3AotGraalvmNativeDemo    : Starting SpringBoot3AotGraalvmNativeDemo v1.0-SNAPSHOT using Java 17.0.6 with PID 2500 (/data/graalvm/spring-boot3-aot-graalvm-native-demo-1.0-SNAPSHOT.jar started by root in /data/graalvm)
2023-07-02T11:18:20.993-04:00  INFO 2500 --- [           main] c.f.s.SpringBoot3AotGraalvmNativeDemo    : No active profile set, falling back to 1 default profile: "default"
2023-07-02T11:18:21.869-04:00  INFO 2500 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2023-07-02T11:18:21.879-04:00  INFO 2500 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2023-07-02T11:18:21.879-04:00  INFO 2500 --- [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.7]
2023-07-02T11:18:21.951-04:00  INFO 2500 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2023-07-02T11:18:21.953-04:00  INFO 2500 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 889 ms
2023-07-02T11:18:22.306-04:00  INFO 2500 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2023-07-02T11:18:22.320-04:00  INFO 2500 --- [           main] c.f.s.SpringBoot3AotGraalvmNativeDemo    : Started SpringBoot3AotGraalvmNativeDemo in 1.803 seconds (process running for 2.287)
2023-07-02T11:18:43.548-04:00  INFO 2500 --- [nio-8080-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2023-07-02T11:18:43.549-04:00  INFO 2500 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2023-07-02T11:18:43.550-04:00  INFO 2500 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms

访问linux服务器的ip:8080/hello成功输出Hello World.

后台启动命令

nohup /data/graalvm/springboot3-native-demo >/dev/null 2>&1 &

查看后台是否启动项目8080是项目的端口号

netstat -ntlp | grep 8080

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

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

相关文章

青少年机器人技术一级核心知识点:机械结构及模型(一)

随着科技的不断进步&#xff0c;机器人技术已经成为了一个重要的领域。在这个领域中&#xff0c;机械结构是机器人设计中至关重要的一部分&#xff0c;它决定了机器人的形态、运动方式和工作效率。对于青少年机器人爱好者来说&#xff0c;了解机械结构的基础知识&#xff0c;掌…

vim背景颜色设置

cd ~进入个人家目录下&#xff0c;vim .vimrc进入vimrc文件&#xff1a; 在主题设置部分对颜色背景进行设置&#xff0c;onedark表示黑色背景&#xff0c;default表示白色背景&#xff0c;按需设置即可&#xff01;

网络知识点-链路聚合

链路聚合&#xff08;英语&#xff1a;Link Aggregation&#xff09;是一个计算机网络术语&#xff0c;指将多个物理端口汇聚在一起&#xff0c;形成一个逻辑端口&#xff0c;以实现出/入流量吞吐量在各成员端口的负荷分担&#xff0c;交换机根据用户配置的端口负荷分担策略决定…

【数据结构】算法的时间和空间复杂度

目录 1.什么是算法&#xff1f; 1.1算法的复杂度 2.算法的时间复杂度 2.1 时间复杂度的概念 计算Func1中count语句总共执行了多少次 2.2 大O的渐进表示法 2.3常见时间复杂度计算举例 实例1:执行2N10次 实例2:执行MN次 实例3:执行了100000000次 实例4:计算strchr的时…

java jwt生成token并在网关设置全局过滤器进行token的校验并在给请求头设置参数及在微服务中解析参数

1、首先引入jjwt的依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> </dependency>2、编写生成token的工具类 package com.jjw.result.util;import com.jjw.res…

软考高级系统架构设计师(九) 作文模板-论设计模式及其应用(未完待续)

目录 掌握的知识点 创建型 结构型 行为型 掌握的知识点 设计模式分为哪3类 每一类包含哪些具体的设计模式 创建型 创建型模式是对对象实例化过程的抽象&#xff0c;他通过抽象类所定义的接口&#xff0c;封装了系统中对象如何创建、组合等信息。 创建型模式主要用于创建对…

【物联网】微信小程序接入阿里云物联网平台

微信小程序接入阿里云物联网平台 一 阿里云平台端 1.登录阿里云 阿里云物联网平台 点击进入公共实例&#xff0c;之前没有的点进去申请 2.点击产品&#xff0c;创建产品 3.产品名称自定义&#xff0c;按项目选择类型&#xff0c;节点类型选择之恋设备&#xff0c;联网方式W…

Linux下安装Redis的详细安装步骤

一.Redis安装 1.下载linux压缩包 【redis-5.0.5.tar.gz】 2.通过FlashFXP把压缩包传送到服务器 3.解压缩 tar -zxvf redis-5.0.5.tar.gz4.进入redis-5.0.5可以看到redis的配置文件redis.conf 5.基本的环境安装 使用gcc -v 命令查看gcc版本已经是4.8.5了&#xff0c;于是就…

ubuntu系统突然失去网络问题

修复ubuntu系统网络问题 1. 服务不存在&#xff1f;2. 修改配置&#xff0c;自动启动网络 每天都在用的ubuntu系统突然ssh连接不上&#xff0c;进系统ifconfig也不显示ip。当然也ping不通任何网页。 1. 服务不存在&#xff1f; 初步怀疑网络服务被关闭了&#xff0c;需要修改配…

【C6】数据类型/移植/对齐,内核中断,通过IO内存访问外设,PCI

文章目录 1.内核基础数据类型/移植性/数据对齐&#xff1a;页大小为PAGE_SIZE&#xff0c;不要假设4K&#xff0c;保证可移植性1.1 kdatasize.c&#xff1a;不同的架构&#xff08;x86_64,arm&#xff09;&#xff0c;基础类型大小可能不同&#xff0c;主要区别在long和指针1.2…

chatgpt赋能python:用Python访问数据库的SEO文章

用Python访问数据库的SEO文章 在当今互联网飞速发展的时代&#xff0c;数据处理和数据库技术的重要性不言而喻。在这些应用中&#xff0c;Python是使用最广泛和最受欢迎的编程语言之一。Python的简单和易学性使其成为理想的选项&#xff0c;可以通过Python来访问各种类型的数据…

荣耀90推出最新MagicOS7.1更新,增加控制中心功能

荣耀 90 系列机型推出了最新的 Magic OS 7.1更新&#xff0c;版本号为7.1.0.137 (C00E130R2P2)。该更新主要增加了控制中心功能&#xff0c;并对部分场景拍摄效果进行了优化。此外&#xff0c;该更新还提升了系统与部分三方应用的兼容性&#xff0c;以提高系统性能和稳定性。 …

选择最适合您自动化系统的控制方式

自动化系统可采用多种不同的控制方式&#xff0c;其中硬件控制和PLC&#xff08;可编程逻辑控制器&#xff09;是常见的选择。 刚好&#xff0c;我这里有上位机入门&#xff0c;学习线路图&#xff0c;各种项目&#xff0c;需要留个6。 硬件控制通常指使用专用硬件电路实现控…

C++3(sizeof和逗号运算符,类型转换)

1.sizeof的用法 逗号运算符 口诀&#xff1a;从左到右算&#xff0c;返回最右边的值 类型转换 如何实现的隐式类型转换&#xff1f; 先算右边的&#xff0c;右边的3&#xff08;int&#xff09;先提升为double &#xff0c;然后算得&#xff08;7.541&#xff08;double&#…

CMU 15-445 -- 关系型数据库重点概念回顾 - 01

CMU 15-445 -- 关系型数据库重点概念回顾 - 01 引言Relational Data ModelDBMS数据模型Relational ModelRelation & TuplePrimary KeysForeign Keys Data Manipulation Languages (DML)Relational Algebra Advanced SQLSQL 的历史SQLAggregatesGroup ByHavingOutput Redire…

内存屏障类型表

load store 啥意思 内存屏障类型表 StoreLoad Barriers是一个“全能型”的屏障&#xff0c;它同时具有其他3个屏障的效果。现代的多处理器大多支持该屏障&#xff08;其他类型的屏障不一定被所有处理器支持&#xff09;。执行该屏障开销会很昂贵&#xff0c;因为当前处理器通常…

在文件每行开头或结尾插入指定字符

1、在文件每行插入指定字符 sed -i "s/^/curl /g" missing.txt效果 2、在每行末尾插入指定字符 sed -i "s/$/结束 /g" missing.txt

leetcode1856. 子数组最小乘积的最大值(单调栈-java)

子数组最小乘积的最大值 leetcode1856.子数组最小乘积的最大值题目描述解题思路代码演示&#xff1a; 经典算法集锦 leetcode1856.子数组最小乘积的最大值 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/maximum-subarr…

【网络安全】初探SQL注入漏洞

如何利用SQL注入漏洞获取用户密码 前言1. 设计思路2. 设计目的 一、网站快速搭建1. 登录页2. 注册页3. 数据库连接页4. 首页&#xff08;登录后跳转到此处&#xff09;5. session页6. 注销页7. 查询页8. 数据库 二、SQL注入实例&#xff08;小试牛刀&#xff09;1. 猜测漏洞逻辑…

tomcat部署以及优化

目录 1.三个核心组件 2.tomcat服务部署 3.虚拟主机配置 4.tomcat优化 5.部署两台tomcat服务器 6.总结 1.三个核心组件 web容器 完成web服务 servlet容器 名为catalina 用于处理servlet JSP容器 将JSP动态网页翻译成…