当前位置:   article > 正文

Springboot3新特性:开发第一个 GraalVM 本机应用程序(完整教程)_springboot3之graalvm

springboot3之graalvm

在讲述之前,各位先自行在网上下载并安装Visual Studio 2022,安装的时候别忘了勾选msvc

概述:GraalVM 本机应用程序(Native Image)是使用 GraalVM 的一个特性,允许将 Java 应用程序编译成本机二进制文件,而不是传统的 Java 字节码。这意味着你可以将 Java 应用程序编译成一个独立的可执行文件,无需 JVM(Java 虚拟机)即可运行。

以下是 GraalVM 本机应用程序的一些关键特点:

  1. 启动时间快: 由于本机二进制文件不需要解释执行,而是直接在本机执行,因此启动时间通常比传统的 Java 应用程序更快。

  2. 较小的内存占用: 本机应用程序通常有较小的内存占用,因为它们不需要运行在 JVM 上。

  3. 不依赖于 JVM: 本机应用程序可以独立运行,无需事先安装 Java 运行时环境。这使得它们更容易部署和分发。

  4. AOT 编译: GraalVM 使用 AOT(Ahead-of-Time)编译技术,将应用程序代码编译成本机机器码,而不是在运行时进行即时编译。

使用 GraalVM 本机应用程序有助于改善 Java 应用程序的性能和资源利用效率,特别是在云原生和微服务架构中。然而,需要注意的是,并非所有的 Java 应用程序都适合使用 GraalVM 本机应用程序,因为某些应用程序可能依赖于动态特性或反射等功能,而这些在 AOT 编译中可能会带来挑战。

第一步:创建springboot项目,勾选GraalVM Native Support依赖

第二步:编写示例程序

  1. package org.cyl.test04;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6. @RestController
  7. @SpringBootApplication
  8. public class MyApplication {
  9. @RequestMapping("/")
  10. String home() {
  11. return "Hello World!";
  12. }
  13. public static void main(String[] args) {
  14. SpringApplication.run(MyApplication.class, args);
  15. }
  16. }

项目结构如下

pom文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>org.cyl</groupId>
  6. <artifactId>test04</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <name>test04</name>
  9. <description>test04</description>
  10. <properties>
  11. <java.version>17</java.version>
  12. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  13. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  14. <spring-boot.version>3.2.1</spring-boot.version>
  15. </properties>
  16. <parent>
  17. <groupId>org.springframework.boot</groupId>
  18. <artifactId>spring-boot-starter-parent</artifactId>
  19. <version>3.2.1</version>
  20. </parent>
  21. <dependencies>
  22. <dependency>
  23. <groupId>org.springframework.boot</groupId>
  24. <artifactId>spring-boot</artifactId>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-starter-web</artifactId>
  29. </dependency>
  30. <dependency>
  31. <groupId>org.springframework.boot</groupId>
  32. <artifactId>spring-boot-starter-test</artifactId>
  33. <scope>test</scope>
  34. </dependency>
  35. </dependencies>
  36. <dependencyManagement>
  37. <dependencies>
  38. <dependency>
  39. <groupId>org.springframework.boot</groupId>
  40. <artifactId>spring-boot-dependencies</artifactId>
  41. <version>${spring-boot.version}</version>
  42. <type>pom</type>
  43. <scope>import</scope>
  44. </dependency>
  45. </dependencies>
  46. </dependencyManagement>
  47. <build>
  48. <plugins>
  49. <plugin>
  50. <groupId>org.apache.maven.plugins</groupId>
  51. <artifactId>maven-compiler-plugin</artifactId>
  52. <version>3.8.1</version>
  53. <configuration>
  54. <source>17</source>
  55. <target>17</target>
  56. <encoding>UTF-8</encoding>
  57. </configuration>
  58. </plugin>
  59. <plugin>
  60. <groupId>org.graalvm.buildtools</groupId>
  61. <artifactId>native-maven-plugin</artifactId>
  62. <configuration>
  63. <imageName>sb</imageName>
  64. <mainClass>org.cyl.test04.MyApplication</mainClass>
  65. <buildArgs>
  66. --no-fallback
  67. </buildArgs>
  68. </configuration>
  69. <executions>
  70. <execution>
  71. <id>build-native</id>
  72. <goals>
  73. <goal>compile-no-fork</goal>
  74. </goals>
  75. <phase>package</phase>
  76. </execution>
  77. </executions>
  78. </plugin>
  79. </plugins>
  80. </build>
  81. <repositories>
  82. <repository>
  83. <id>spring-releases</id>
  84. <name>Spring Releases</name>
  85. <url>https://repo.spring.io/release</url>
  86. <snapshots>
  87. <enabled>false</enabled>
  88. </snapshots>
  89. </repository>
  90. </repositories>
  91. </project>

刷新的时候勾选native

第三步:安装GraalVM

官网:https://www.graalvm.org/downloads/#

选择java17,然后download,然后解压缩

配置一下环境变量:

然后回到idea,并运行打包。出现以下错误:

Error: Error compiling query code (in C:\Users\ADMINI~1\AppData\Local\Temp\SVM-16192823869583359649\WindowsDirectives.c). Compiler command ''D:\WindowsVSC\VC\Tools\MSVC\14.36.32532\bin\Hostx64\x64\cl.exe' /WX /W4 /wd4201 /wd4244 /wd4245 /wd4800 /wd4804 /wd4214 '/FeC:\Users\ADMINI~1\AppData\Local\Temp\SVM-16192823869583359649\WindowsDirectives.exe' 'C:\Users\ADMINI~1\AppData\Local\Temp\SVM-16192823869583359649\WindowsDirectives.c'' output included error: [WindowsDirectives.c, C:\Users\ADMINI~1\AppData\Local\Temp\SVM-16192823869583359649\WindowsDirectives.c(5): fatal error C1034: stdio.h:

这是未配置INCLUDE环境变量的原因。

先打开,你的vs studio的文件目录

然后找到你们的include:这个库

配置一下环境变量:

在配置一下lib库:

配置好了,再试一次,打包:

当然也会报错啦,我知道你很急但是你先别急。include的那块没有写完整。

知道了吧,真正的库是在D:\Windows Kits\10\Include\10.0.22000.0里面加上msvc里面的include

所以要重新设置一下INCLUDE环境变量。最好把下面的所有东西都放到那个环境变量里面

那lib包呢,肯定是要在修改一下的。

Lib包的真实目录:D:\Windows Kits\10\Lib\10.0.22000.0和msvc的都加入进去

同理最好把,那些目录都存到环境变量里面

最后在打包一下看看。应该没有问题

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/68735
推荐阅读
相关标签
  

闽ICP备14008679号