跳转到内容

Native Image 支持

本指南介绍如何使用 GraalVM Native Image 将 Feat 应用编译为本地可执行文件。

GraalVM Native Image 是一种将 Java 应用程序编译为本地可执行文件的技术,相比传统 JVM 运行方式具有显著优势:

  • 极速启动:从秒级缩短到毫秒级
  • 低内存占用:减少 5-10 倍内存使用
  • 独立部署:不依赖 JVM,单文件可执行
  • 容器优化:更适合云原生和 Serverless 环境
  • GraalVM 21(推荐)或更高版本
  • Maven 3.6+
  • 原生镜像构建工具(native-image

方式一:使用 Maven 插件构建(推荐)

Section titled “方式一:使用 Maven 插件构建(推荐)”

适用于 JDK 21+ 项目。

<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
<version>0.11.3</version>
<extensions>true</extensions>
<configuration>
<mainClass>tech.smartboot.feat.Bootstrap</mainClass>
<buildArgs>
<argument>--no-fallback</argument>
</buildArgs>
</configuration>
</plugin>
Terminal window
mvn clean native:compile -Dmaven.compiler.source=8 -Dmaven.compiler.target=8

方式二:使用 native-image 命令构建

Section titled “方式二:使用 native-image 命令构建”

适用于 JDK 8 项目。

Terminal window
mvn clean package
Terminal window
native-image \
--no-fallback \
--enable-url-protocols=http,https \
-H:Name=helloworld_native \
-jar target/helloworld_native.jar

以下是一个简单的 Feat 应用示例,完整代码可在 Gitee 示例项目 中找到:

@Controller
public class Bootstrap {
@RequestMapping("/hello")
public String helloWorld() {
return "hello Feat Cloud";
}
public static void main(String[] args) {
FeatCloud.cloudServer().listen();
}
}

构建完成后,测试原生镜像的运行效果:

Terminal window
# 启动原生镜像
./helloworld_native
# 测试基本功能
curl http://localhost:8080/hello
graph TD
    A[准备源代码] --> B[选择构建方式]
    B --> C1[Maven 插件<br/>JDK21+]
    B --> C2[native-image 命令<br/>JDK8]
    C1 --> D[执行 mvn native:compile]
    C2 --> E[打包成 fat jar]
    E --> F[执行 native-image]
    D --> G[生成原生可执行文件]
    F --> G
    G --> H[测试运行]

尽量避免使用运行时动态特性:

// 不推荐
Class<?> clazz = Class.forName(className);
Method method = clazz.getMethod("methodName");
// 推荐
// 使用 Feat AOT 编译替代运行时反射

Feat 框架通过 AOT 编译机制,天然适合 GraalVM Native Image 构建。相比其他框架需要大量配置才能构建原生镜像,Feat 几乎无需额外工作即可获得高性能原生应用。

问题原因解决方案
ClassNotFoundException缺少类路径配置检查依赖完整性
NoSuchMethodException反射配置缺失添加反射配置
Resource not found资源文件未包含配置资源包含规则

启用 GraalVM 诊断输出以定位问题:

Terminal window
native-image \
--no-fallback \
-H:+PrintAnalysisCallTree \
-H:AnalysisLogLevel=INFO \
-jar target/helloworld_native.jar
指标JVM 模式Native Image
启动时间秒级毫秒级
内存占用较高降低 5-10 倍
包体积较小(需 JVM)较大(独立运行)
峰值性能JIT 优化后高略低于 JIT
  • 云原生应用:容器化部署、Kubernetes
  • Serverless:函数计算、Lambda
  • 微服务:快速启动、弹性伸缩
  • 边缘计算:资源受限环境