准备工作

安装GraalVM工具

使用 sdkman 下载并安装 GraalVM的jdk

sdk install java 22.3.1.r17-grl

安装好后,将该sdk设置为默认

sdk default java 22.3.1.r17-grl

检查版本

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)

检查gu工具版本:

gu --version

GraalVM Updater 22.3.1

安装native-image

gu install native-image
# 若无法正常安装,可以将其github.com的下载地址手工下载jar文件到本地,之后使用 -L 参数本地安装

# 检查native-image的安装
gu list

ComponentId              Version             Component name                Stability                     Origin
---------------------------------------------------------------------------------------------------------------------------------
graalvm                  22.3.1              GraalVM Core                  Supported
native-image             22.3.1              Native Image                  Early adopter

创建SpringBoot3.1的Maven项目

使用idea的创建SpringBoot3.1的向导创建项目,要求选择其中的native

构建本地应用

构建时参考文章 https://blog.csdn.net/BASK2311/article/details/128830624

修改pom.xml的native-maven-plugin插件配置

将原来的

            <plugin>
                <groupId>org.graalvm.buildtools</groupId>
                <artifactId>native-maven-plugin</artifactId>
            </plugin>

添加启动类,则修改为:

            <plugin>
                <groupId>org.graalvm.buildtools</groupId>
                <artifactId>native-maven-plugin</artifactId>
                <configuration>
                    <mainClass>top.yjp.zentao.ZentaoTaskApplication</mainClass>
                </configuration>
            </plugin>

编译打包

编译和打包该SpringBoot应用的时候应该使用如下命令

mvn clean package -Pnative

构建本地应用

执行如下命令:

mvn native:compile-no-fork

经过漫长的等待后,可以看到target文件夹内编译了一个本地文件。

运行应用

cd target
./zentao-task 

完整的 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.1.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>zentao-task</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>zentao-task</name>
    <description>zentao-task</description>
    <properties>
        <java.version>17</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.mariadb.jdbc</groupId>
            <artifactId>mariadb-java-client</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </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>
                <configuration>
                    <mainClass>top.yjp.zentao.ZentaoTaskApplication</mainClass>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

后记(2023-06-01)

反复测试,发现只有第一次成功了。后面编译的时候,都会报mybaits需要启用 –parameters 参数进行编译。 查了一下 mybatis-plus的issue 发现其3.5.3.1的版本其实还不支持 SpringBoot3.可能需要耐心等待一下了。 这两个链接:

https://github.com/baomidou/mybatis-plus/issues/5358

https://github.com/mybatis/mybatis-3/issues/2858

折中方案

当前(2023-06-01)可以使用如下方案代替mybatis-plus 使用 mybatis-spring 3.0.2 可以正常编译与构建本地应用,只是没有了mybatis-plus的默认CRUD的几个实现,需要自己实现。