GraalVM 介绍
既然是VM,那肯定也是一个虚拟机,那它跟JVM有关系吗?有一定关系,GraalVM 可以完全取代上面提到的那几种虚拟机,比如 HotSpot。把你之前运行在 HotSpot 上的代码直接平移到 GraalVM 上,不用做任何的改变,甚至都感知不到,项目可以完美的运行。但是 GraalVM 还有更广泛的用途,不仅支持 Java 语言,还支持其他语言。这些其他语言不仅包括嫡系的 JVM 系语言,例如 Kotlin、Scala,还包括例如 JavaScript、Nodejs、Ruby、Python 等,如图。
GraalVM Native Image 介绍
GraalVM Native Image 是GraalVM 提供的一种能够将Spring Boot 程序打包成云原生可执行文件的技术,并且比JVM 占用更少的内存和更快的启动速度,非常适合使用容器部署和在Faas平台使用。与在JVM运行的应用程序不同,GraalVM Native Image需要提前对代码进行编译处理才能创建可执行文件,GraalVM Native Image 的运行不需要提供JVM虚拟机。
GraalVM 文档地址:https://www.graalvm.org/latest/docs/getting-started/ GraalVM Native Image 文档地址:https://www.graalvm.org/latest/reference-manual/native-image/
创建第一个GraalVM云原生应用程序
有两种办法创建原生应用程序:
-
使用Cloud Native Buildpacks 来生成一个包含可执行应用程序的轻量级容器 -
使用GraalVM Native 构建工具生成一个可执行文件
下面示例使用GraalVM Native来构建。
环境准备
安装GraalVM SDK
压缩包安装
下载对应版本软件:https://github.com/graalvm/graalvm-ce-builds/releases
-
Windows
-
解压ZIP包到安装目录 -
配置 path
路径到GraalVM 的bin
目录
setx /M PATH “C:Progra~1Java<graalvm>bin;%PATH%”
-
配置 JAVA_HOME
到GraalVM 的安装目录
setx /M JAVA_HOME “C:Progra~1Java<graalvm>”
-
重启,测试
-
解压ZIP包到指定目录
tar -xzf graalvm-ce-java
-linux- – .tar.gz
-
配置 PATH
路径
export PATH=/path/to/
/bin:$PATH
-
配置 JAVA_HOME
路径
export JAVA_HOME=/path/to/
-
测试
-
MAC
-
解压ZIP包
tar -xzf graalvm-ce-java
-darwin-amd64- .tar.gz
如果使用的是macOS Catalina更高版本,可能需要执行如下命令:sudo xattr -r -d com.apple.quarantine /path/to/graalvm
-
移动解压的包到 /Library/Java/JavaVirtualMachines
sudo mv graalvm-ce-java
– /Library/Java/JavaVirtualMachines
验证是否成功:/usr/libexec/java_home -V 将会得到一个安装的JDK目录
-
配置 PATH
路径
export PATH=/Library/Java/JavaVirtualMachines/
/Contents/Home/bin:$PATH
-
配置 JAVA_HOME
路径
export JAVA_HOME=/Library/Java/JavaVirtualMachines/
/Contents/Home
IDEA 安装
使用IDEA内置功能即可,下载有点慢,这边IDEA只有基于Java 19 的版本
使用IDEA 下载后,只能在IDEA内部运行应用程序,如果要使用maven 打包,还需要配置PATH
和JAVA_HOME
路径,同压缩包安装方式
安装Native Image 工具
如果没有安装该工具,maven 在打包的时候会自动下载,但建议提前安装打包工具
gu install native-image
安装Native Image依赖的本地环境
因为要编译成指定本地可执行文件,比如exe,需要Windows安装了Microsoft Visual C++ (MSVC
), MAC 需要安装xcode,通过xcode-select --install
, Linux sudo yum install gcc glibc-devel zlib-devel
Ubuntu sudo apt-get install build-essential libz-dev zlib1g-dev
其他Linux sudo dnf install gcc glibc-devel zlib-devel libstdc++-static
这里以Windows为例,安装 Visual Studio 2017 或更高版本的 构建工具和 Windows 10 SDK
使用start.spring.io创建一个Spring Boot 3.0应用
1、选择Java 17 版本 2、选择GraalVM Native Support、Spring Web
创建后的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.0.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>graalvm-native-application</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>graalvm-native-application</name>
<description>graalvm-native-application</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<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>
3、写一个简单的接口
package com.example.graalvmnativeapplication;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@SpringBootApplication
public class GraalvmNativeApplication {
public static void main(String[] args) {
SpringApplication.run(GraalvmNativeApplication.class, args);
}
@RequestMapping("/")
String home() {
return "Hello World!";
}
}
4、打包可执行文件 在 安装VS 中找到 x64 Native Tools Command Prompt 执行如下命令
mvn -Pnative native:compile
一共7个步骤,花费了差不多2分钟打包完,生成的可执行文件在target
目录
5、运行可执行文件 双击exe文件,Spring Boot 应用程序几乎瞬间启动完毕,文件大小有68M,对于一个没什么业务代码的demo来说,确实太大了。
访问地址http://localhost:8080/
,能正常访问。
6、与Java 17 比较
VM | 包大小 | 启动时间 |
---|---|---|
GraalVM Native Image | 68M | 0.15s |
Java 17 | 18M | 2.15s |
Java 8 | 16.5M | 3.5s |
从这个DEMO看出,使用GraalVM Spring Boot 的启动时间确实快乐很多,但同时包也大了很多 ,有点空间换时间的意思。如果要打包原生可执行文件的话,环境配置也比较繁琐。不过使用GraalVM 来替代JVM 跑Java 程序还是很值得尝试的。
原文始发于微信公众号(阿提说说):用了GraalVM,Spring Boot 起飞了
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/101431.html