You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Quarkus开发模式如何实现JNI原生库仅加载一次 规避热重载重复加载问题

Quarkus JNI库热重载重复加载问题解决方案

两种方案都可落地,你可以根据自己的开发场景选择:

方案1:实现原生库仅加载一次(推荐,可保留热重载能力)

JNI库是JVM进程级别的资源,同一进程内重复加载会抛出UnsatisfiedLinkError,我们可以通过JVM全局标记位判断是否已经完成加载,避免重复调用加载逻辑,不受Quarkus热重载时类加载器切换的影响,修改后的代码示例如下:

@Startup
public class StartUpService {

    void onStart(@Observes StartupEvent ev) {
        // 用JVM全局系统属性做加载标记,热重载不会清除该标记
        if (System.getProperty("core.lib.loaded") != null) {
            return;
        }
        try {
            loadCoreLibrary();
            // 加载成功后设置标记
            System.setProperty("core.lib.loaded", "true");
        } catch (UnsatisfiedLinkError e) {
            // 兜底兼容:如果库已经被其他逻辑加载过,直接跳过即可
            Log.info("Native core library already loaded, skip");
        } catch (Exception ex) {
            Log.error("Couldn't load libraries ", ex);
            Quarkus.asyncExit();
        }
    }
}

该方案不需要关闭热重载,不影响Java代码的热更新效率,额外逻辑几乎没有性能损耗,适合JNI库迭代频率低、日常开发以修改Java代码为主的场景。

方案2:关闭开发模式热重载

如果你的JNI库本身也在频繁迭代,每次修改原生代码都需要重启Quarkus进程才能生效,关闭热重载也不会影响开发效率,可以选择该方案,关闭方式有两种:

  • 启动时添加启动参数:java -Dquarkus.dev.enabled=false -jar your-quarkus-app.jar
  • 在application.properties配置文件中添加配置:quarkus.dev.enabled=false

内容的提问来源于stack exchange,提问作者Shonayev Shyngys

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 18:06:03