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

GraalVM编译Clojure原生镜像无法加载BouncyCastle提供者

GraalVM编译Clojure程序无法加载BouncyCastle提供者的解决方案

问题背景

将调用BouncyCastle EDDSA签名的Clojure程序通过GraalVM编译为原生镜像后,运行时抛出missing provider或NoSuchAlgorithmException: no such algorithm: EDDSA for provider BC异常,但通过普通java命令运行完全正常。尝试过手动实例化BouncyCastleProvider、调用Security/addProvider,以及添加-H:AdditionalSecurityProviders参数均无效,且-H:+TraceSecurityService编译报告中无BouncyCastle相关信息。

核心原因

  1. GraalVM原生镜像的静态分析特性会剔除未被显式引用的代码,而Java安全服务依赖SPI(服务提供者接口)动态加载实现类,GraalVM默认无法自动识别这些动态加载的类。
  2. Clojure的动态特性进一步加剧了这个问题,GraalVM无法追踪到代码中隐式依赖的BouncyCastle服务实现。

解决步骤

1. 显式引用BouncyCastle的EDDSA实现类

在代码中直接加载EDDSA的具体实现类,强制GraalVM将其包含进原生镜像:

(defn -main [& args]
  ;; 显式加载EDDSA实现类,触发GraalVM的静态分析检测
  (Class/forName "org.bouncycastle.jcajce.provider.asymmetric.edec.EDDSASignatureSpi$PlainEdDSA")
  (let [bc-provider (org.bouncycastle.jce.provider.BouncyCastleProvider.)]
    (java.security.Security/addProvider bc-provider)
    (println (java.security.Signature/getInstance "EDDSA" bc-provider))))

2. 添加SPI配置文件并确保被包含

在项目resources/META-INF/services目录下创建java.security.Provider文件,写入:

org.bouncycastle.jce.provider.BouncyCastleProvider

编译时添加参数确保该配置文件被包含:

-H:IncludeResources=META-INF/services/java.security.Provider

3. 调整编译参数优化BouncyCastle加载

使用以下编译参数组合,确保BouncyCastle在编译时完成初始化并被完整包含:

native-image \
  -H:AdditionalSecurityProviders=org.bouncycastle.jce.provider.BouncyCastleProvider \
  -H:+ReportExceptionStackTraces \
  -H:IncludeResources=META-INF/services/.* \
  --initialize-at-build-time=org.bouncycastle \
  -jar your-clojure-app.jar

--initialize-at-build-time=org.bouncycastle参数让BouncyCastle在镜像构建阶段就完成初始化,避免运行时加载失败。

4. 验证版本兼容性

确保使用的BouncyCastle版本与GraalVM的JDK版本匹配:

  • GraalVM 11:推荐BouncyCastle 1.68+
  • GraalVM 17:推荐BouncyCastle 1.70+

验证方法

重新编译时添加-H:+TraceSecurityService参数,查看输出报告中是否出现BouncyCastle的服务注册信息;运行编译后的原生镜像,确认异常不再抛出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 22:55:03