环境准备:
本地环境:
Windows10系统 64位
Maven 3.8.4
GraalVM CE 22.1.0(包含了 Openjdk 11.0.15 )
Visual Studio 2022 社区版
一、安装 graalvm
相关介绍:
GraalVM-下一代JVM简介
GraalVM的三大特点总结如下:
-
GraalVM可以代替JDK、JVM之前的工作。
-
GraalVM除了支持Java,也支持多种语言。
-
GraalVM可以对应用AOT,也就是把程序直接编译成二进制,从而提升启动速度、改进内存使用。
另外,GraalVM编译java项目为原生可执行程序的假设条件:
尽量少的JNI调用
尽量少的使用反射
尽量少的class loader隔离等
即使项目中用到了JNI、反射这些,也没关系,可以通过在启动参数中配置一些必要的信息,告诉GraalVM单独处理这些信息(不再本文中的讨论范围之内)。
不废话了,直接开搞!!
-
下载
官网URL:https://www.graalvm.org/downloads/
有两个版本,分别以java8/java11 进行构建,本教程选择java11版本进行构建
java11:https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-20.3.0/graalvm-ce-java11-windows-amd64-20.3.0.zip -
解压配置环境变量(同JDK配置一致)
GRAALVM_HOME: D:\ProgramFiles\Java\graalvm-ce-java11-22.1.0
JAVA_HOME:D:\ProgramFiles\Java\graalvm-ce-java11-22.1.0
CLASSPATH: .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
Path:%JAVA_HOME%\bin
-
cmd查看
安装 native-image
二、安装 Visual Studio
Windows开发环境下,还需要安装Visual Studio,否则maven打native-image时会报错:
Error: Default native-compiler executable 'cl.exe' not found via environment variable PATH
下载地址:Microsoft C++ 生成工具 - Visual Studiohttps://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/
勾选一些必须的工具包
然后开始下载
下载中....
经过N分钟后,终于 下载完了....
然后,在安装的时候,语言包勾选英文,去掉中文,否则使用mvn命令打native-image时会编译报错: Native-image building on Windows currently only supports target architecture: AMD64 (32-bit architecture x86 unsupported)
开始菜单 => Visual Studio Installer => 修改生成工具 => 语言包勾选英文,去掉中文。
提示安装完毕:
然后配置好环境变量:
MSVC = C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.32.31326
WK10_INCLUDE = C:\Program Files (x86)\Windows Kits\10\Include\10.0.20348.0
WK10_LIB = C:\Program Files (x86)\Windows Kits\10\Lib\10.0.20348.0
## 变量值必须为INCLUDE和LIB
INCLUDE = %WK10_INCLUDE%\ucrt;%WK10_INCLUDE%\um;%WK10_INCLUDE%\shared;%MSVC%\include
LIB = %WK10_LIB%\um\x64;%WK10_LIB%\ucrt\x64;%MSVC%\lib\x64
# 添加path中指定 MSVC cl.exe路径(X86架构的操作系统,32位,请根据实际情况选择)
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.32.31326\bin\Hostx86\x86
# 添加path中指定 MSVC cl.exe路径(X64架构的操作系统,64位,请根据实际情况选择)
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.32.31326\bin\Hostx64\x64
MSVC 相关配置,不配置好的话,mvn 编译会报错:Cannot open include file: 'stdio.h': No such file or directory
'stdio.h 文件一般在 {安装路径}\Windows Kits\10\Include 下
cl.exe 如果未配置的话,,在执行“./mvnw package -Pnative”命令打本地镜像时则会报错:
com.oracle.svm.core.util.UserError$UserException: Default native-compiler executable 'cl.exe' not found via environment variable PATH
如果操作系统架构与cl.exe所在路径不匹配的话,则会报如下错误,
Native-image building on Windows currently only supports target architecture: AMD64 (32-bit architecture x86 unsupported)
另外,MAVEN自己装一下就好了,就不再赘叙
至此,环境就搞好了,
三、新建quarkus的demo项目
(搭建步骤略.....)
可自己手动搭建,也可使用官网生成
如果只是需要体验quarkus的急速启动、占用极少内存的话,可以用已经弄好的demo代码,压缩包的链接如下:
链接:https://pan.baidu.com/s/1_Gm6dijqLh2Pwn18h-vDgw?pwd=wr1c
提取码:wr1c
项目的pom.xml文件
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>org.acme</groupId>
<artifactId>code-with-quarkus</artifactId>
<version>1.0.0-SNAPSHOT</version>
<properties>
<compiler-plugin.version>3.8.1</compiler-plugin.version>
<failsafe.useModulePath>false</failsafe.useModulePath>
<maven.compiler.release>11</maven.compiler.release>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
<quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id>
<quarkus.platform.version>2.9.0.Final</quarkus.platform.version>
<surefire-plugin.version>3.0.0-M5</surefire-plugin.version>
<maven.home>D:\ProgramFiles\apache-maven-3.8.4</maven.home>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>${quarkus.platform.group-id}</groupId>
<artifactId>${quarkus.platform.artifact-id}</artifactId>
<version>${quarkus.platform.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-jsonb</artifactId>
<version>${quarkus.platform.version}</version>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-junit5</artifactId>
<version>${quarkus.platform.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<version>5.0.0</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${compiler-plugin.version}</version>
<configuration>
<source>${maven.compiler.release}</source>
<target>${maven.compiler.release}</target>
<!-- the parameters=true option is critical so that RESTEasy works fine -->
<parameters>true</parameters>
</configuration>
</plugin>
<plugin>
<!-- you need this specific version to integrate with the other build helpers -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${surefire-plugin.version}</version>
<configuration>
<systemPropertyVariables>
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
<maven.home>${maven.home}</maven.home>
</systemPropertyVariables>
</configuration>
</plugin>
<plugin>
<!-- This is what injects the magic Quarkus bytecode -->
<groupId>${quarkus.platform.group-id}</groupId>
<artifactId>quarkus-maven-plugin</artifactId>
<version>${quarkus.platform.version}</version>
<executions>
<execution>
<goals>
<goal>build</goal>
<goal>generate-code</goal>
<goal>generate-code-tests</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>native</id>
<properties>
<quarkus.package.type>native</quarkus.package.type>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>${surefire-plugin.version}</version>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
<configuration>
<systemPropertyVariables>
<native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path>
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
<maven.home>${maven.home}</maven.home>
</systemPropertyVariables>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>
后端接口类:
package org.acme;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/hello")
public class GreetingResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "Hello from RESTEasy Reactive";
}
}
整个项目结构:
然后进行打native-image,命令如下
mvn package -Pnative
这次终于成功了。。。。。
构建出来的包,也才42MB
果然启动速度超快,毫秒级别.....
内存占用12MB左右
访问首页:
本地访问下接口,耗时1毫秒....
另外,可以构建 uber-jar (所有你自己的东西在 uber-jar 中的依赖关系也都在 uber-jar 中),类似打传统的jar包
命令:
mvn package -D quarkus.package.type=uber-jar
参考文档:
GraalVM 官网下载链接 https://www.graalvm.org/downloads/
graalvm win10 64位环境搭建 https://www.jianshu.com/p/a5cdf85e4ffa
windows10 下 quarkus和GraalVM打包exe启动超快
使用Graalvm简单编译native-image
虚拟机研究:JDK/JVM的新储方式—GraalVM和Quarkus https://baijiahao.baidu.com/s?id=1709080667810830871
应“云”而生的 Java 框架Quarkus:构建本机可执行文件