solon graalvm native

本项目是一个 将solon打包成 native 可执行程序 的示例

1、环境要求

graalvm 17 & native-image

graalvm 17

官方安装文档:https://www.graalvm.org/latest/docs/getting-started/#install-graalvm

下载地址:https://github.com/graalvm/graalvm-ce-builds/releases

下载对应的版本,建议使用 sdkman ( 安装地址:https://sdkman.io/ ) 来管理不同的jdk版本

# 最新版本为:17.0.8-graalce,可以在下载地址中查看最新版本
sdk install java 17.0.8-graalce

# 使用 17.0.8-graalce 版本
sdk use java 17.0.8-graalce

native-image

官方安装文档:https://www.graalvm.org/latest/reference-manual/native-image/#install-native-image

gu install native-image

2、打包成 jar

用 install 可以兼容多模块场景,用 package 只适合单模块

mvn clean install -DskipTests

3、打包成 native 可执行程序

  1. 引入依赖(本项目已经引入)
<!--solon aot start(用于 aot 时注册 native 元信息)-->
<dependency>
    <groupId>org.noear</groupId>
    <artifactId>solon.aot</artifactId>
</dependency>
<!--solon aot end-->
  1. 激活 native 的 profile,执行mvn命令
sdk use java 17.0.7-graal

# 打包成native可执行程序
mvn clean native:compile -P native -DskipTests

# 运行可执行成
./target/solon-native-example

4、测试

GET http://localhost:8080/hello?name=solon

GET http://localhost:8080/hello/tml?name=solon

GET http://localhost:8080/htm/hello.htm

remote

GET http://localhost:8080/rpc/v1/user/getById?userId=11
GET http://localhost:8080/rpc/v1/user/addOrder?orderId=12

响应:

{
  "@type": "com.github.dudiao.solon.demo.User",
  "user_name": "dudiao",
  "wxid": "11"
}

service 带缓存

GET http://localhost:8080/cache/say?msg=你好

响应:I want say: 你好, now: 2023-04-15 17:01:09

参数msg不变,响应不变,说明缓存生效

Mybatis native

GET http://localhost:8080/user/1

5、关于 graalvm native 的一些说明

当使用一个新的第三方包时,不知道第三方包中哪些地方使用了反射等 graalvm 不支持的特性,可以使用agentlib:native-image-agent来生成配置文件,然后在native-image命令中引入配置文件,这样就可以解决第三方包中的问题了

-agentlib:native-image-agent=config-output-dir=/Users/xxx/study/solon-native-example/target/tracing-agent

6、三方包的一些不支持项

spring-boot 已经踩了很多坑了,可以作为参考:https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-with-GraalVM