首页 > 其他分享 >对graalvm、springboot3.0一些新特性的探究

对graalvm、springboot3.0一些新特性的探究

时间:2022-12-06 10:44:06浏览次数:89  
标签:springboot3.0 jdk -- add 编译 探究 build graalvm

环境:

系统: Intel core Mac Ventura13.0.1

工具:

  Idea: 2022.2.3

  gradle: 7.4 (idea自带的)

  openjdk: version "17.0.5" 2022-10-18

  graalvm: CE 22.3.0

 

步骤:

1. 安装 graalvm

下载地址[点我]

安装过程挺简单的就不多介绍了。

安装完成后配置JAVA_HOME, 可参考我的配置但不一定要照抄

#!/bin/bash
declare useJdk() { local jdk local machines=/Library/Java/JavaVirtualMachines if [ $1 = 'jdk11' ]; then jdk=$machines/jdk-11.jdk/Contents/Home elif [ $1 = 'jdk17' ]; then jdk=$machines/jdk-17.jdk/Contents/Home elif [ $1 = 'jdk19' ]; then jdk=$machines/jdk-19.jdk/Contents/Home elif [ $1 = 'gdk17' ]; then jdk=$machines/graalvm-ce-java17/Contents/Home else jdk=$JAVA_HOME fi export JAVA_HOME=$jdk export PATH=$JAVA_HOME/bin:$PATH }
#jdk alias jdk11="useJdk jdk11" alias jdk17="useJdk jdk17" alias jdk19="useJdk jdk19" #gdk alias gdk17="useJdk gdk17"
# 若不需要指定版本把下面一行注释,Mac会识别JavaVirtualMachines目录下的jdk,并将最新版作为默认
useJdk gdk17
# 切换时在 控制台输入 jdk11 或 gdk17 即可

在控制台输入指令查看是否配置成功

java -version

如图:

 

 

 

 

2. graalvm 安装native-image 工具

# 控制台输入安装
gu install native-image
# 查看是否安装成功
native-image --help

最后在Idea中配置项目使用的jdk,预备工作就算完成了

 

 

 

 

 

3. 项目中使用

build.gradle

添加插件

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.0.0'
    id 'io.spring.dependency-management' version '1.1.0'
// 主要添加下面native插件
id 'org.graalvm.buildtools.native' version '0.9.18'
}

配置编译指令

graalvmNative {
    binaries {
        main {
// 编译时显示详细信息 buildArgs.add('--verbose') } } }

选择右侧边栏的编译选项即可开始编译 nativeCompile

 

 

 

如果你的项目是一个初始项目比较干净,一般一次能编译过并能成功跑起来。

而博主当然不可能一次编译通过啦,这也是本文编写的目的,为此用了一个以前写的小项目升级springboot3.0

第一次编译结果如下:

 

 大致意思是这个类需要在构建过程中被初始化,Eum~~ 没弄懂? 去到官网瞅了瞅

发现了一些字眼很类似:

 

 

# 构建期初始化?
--initialize-at-build-time: a comma-separated list of packages and classes (and implicitly all of their superclasses) that are initialized during the image build. An empty string designates all packages. # 运行时初始化?
--initialize-at-run-time: a comma-separated list of packages and classes (and implicitly all of their subclasses) that must be initialized at runtime and not during the image build. An empty string is currently not supported.

加上试试

graalvmNative {
    binaries {
        main {
            buildArgs.add('--verbose')
            buildArgs.add("--initialize-at-build-time=org.apache.commons.logging.LogFactory")
        }
    }
}

 

 不错,确实可行

但是还没完。。。

 

 

运行项目看看

 

 缓存炸了,细心的人应该留意到了CGLIB字眼。

 没错了,就是动态代理的问题

 

 官方文档也有对此的说明,我们把参数加上

# build.gradle
graalvmNative { binaries { main { buildArgs.add('--verbose') buildArgs.add("--initialize-at-build-time=org.apache.commons.logging.LogFactory") buildArgs.add("-H:ReflectionConfigurationFiles=$projectDir/reflection-config.json") } } }

-------

# reflection-config.json
# 这个文件主要描述了类的一些信息来给运行期的程序识别的
[
{
"name": "com.github.benmanes.caffeine.cache.PSWMS",
"methods": [
// <init> 固定写法,就是构造方法,普通方法就写名字就好了
{ "name" : "<init>", "parameterTypes" : [] }
]
},
{
"name": "com.github.benmanes.caffeine.cache.SSSMSW",
"methods": [
{
"name" : "<init>",
"parameterTypes" : [
"com.github.benmanes.caffeine.cache.Caffeine", "com.github.benmanes.caffeine.cache.AsyncCacheLoader", "boolean"
]
}
]
}
]


编译、运行 。。。

 

 

启动正常了 

 

---------------

graalvm文档[点我]   |   演示的项目[点我]

 

标签:springboot3.0,jdk,--,add,编译,探究,build,graalvm
From: https://www.cnblogs.com/bingco/p/16954243.html

相关文章

  • 探究lombok-03-@Builder使用
    Java8org.springframework.boot2.7.3lombok1.18.24EclipseVersion:2022-09(4.25.0)--ben发布于博客园 上一篇:探究lombok-02-类继承https://www.cnblogs.com/......
  • Android平台GB28181设备接入模块之球机/云台控制探究
    技术背景好多开发者在做GB28181设备接入的时候,问云台控制是否可以处理(亦或拉取外部RTSP摄像头,通过命令中转的方式,控制摄像头),实际上云台控制命令相对来说还是比较好处理的。......
  • 探究lombok-02-类继承
    Java8org.springframework.boot2.7.3lombok1.18.24EclipseVersion:2022-09(4.25.0)--ben发布于博客园 上一篇:探究lombok-01https://www.cnblogs.com/luo630/......
  • 探究lombok-01
    Java8org.springframework.boot2.7.3lombok1.18.24EclipseVersion:2022-09(4.25.0)-- 0、序ProjectLombok:https://projectlombok.org/ 经常用lombok,特......
  • 探究一种定长队列操作(C ,C++版本)
    一问题来源:南京烽火通信面试二问题:现有一种定长队列,长度为2的n次方,此队列可被多线程访问,但必须确保线程级安全,即在任意时刻,队列的长度保持不变。三笔者分析1.队列的存储......
  • 概念映射与图像识别相结合的科学探究课程学习方法
    概念映射与图像识别相结合的科学探究课程学习方法(Anintegratedconceptmappingandimagerecognitionapproachtoimprovingstudents'scientificinquirycoursep......
  • java中乐观锁CAS的实现探究——AtomicInteger
    CASCAS——compareandswap,比较并交换。是一种乐观锁的实现方式。更新操作时,在每次更新之前,都先比较一下被更新的目标T,值是不是等于读取到的旧值O,如果相等,则认为在读取......
  • 从源码的角度探究Activity的启动过程
    一.概述今天我们来搞一下底层一点的东西,大家可能对Activity的生命周期比较熟悉,但是一个Activity是如何启动起来的,你知道吗?今天就来探究一下。二.分析我们先随便写一个demo,然......
  • post接口请求入参格式探究
    使用axios的post接口入参有两种常用的格式需要注意:1、默认post入参是json对象形式requestheaders中定义了Content-Type:application/json   入参形式:request......
  • 探究Android碎片Fragment
    简介碎片(Fragment)是一种可以嵌入在活动中的UI片段,它让程序更加合理充分利用大屏幕空间碎片的使用方式1.引入布局新建左右两个LinearLayout水平布局的xml,在main.xml中......