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
相关产品推荐
相关产品推荐

