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

Gradle测试Bouncy Castle签名冲突致ExceptionInInitializerError排查求助

排查Bouncy Castle依赖签名冲突与类路径问题的方法

一、彻底排查类路径中的Bouncy Castle依赖

  • 打印完整测试运行类路径,直接定位所有BC相关jar:
    执行Gradle命令:./gradlew :your-module:printTestRuntimeClasspath(替换your-module为实际模块名),在输出中搜索包含bouncycastle、bc-fips、bcpkix-fips的条目,检查是否有未预期的版本或来源。
  • 生成完整依赖树,排查间接依赖:
    执行./gradlew dependencies --configuration testRuntimeClasspath,遍历整个依赖树,确认是否有其他模块或第三方依赖偷偷引入了不同版本的Bouncy Castle包——这是dependencyInsight容易漏掉的场景。
  • 检查本地手动添加的jar:
    确认测试目录(如src/test/resources、lib)下有没有手动放置的BC相关jar,这类文件不会被Gradle依赖树扫描到。
  • 验证依赖排除规则:
    如果之前配置过依赖排除,检查排除规则是否覆盖了所有可能引入冲突BC版本的依赖,比如:
    implementation('some-dependency') {
        exclude group: 'org.bouncycastle', module: 'bc-fips'
    }
    

二、验证包签名信息差异

  • 定位报错类的加载来源:
    在测试任务的JVM参数中添加-verbose:class,运行测试后,在日志中搜索org.bouncycastle.util.test.TestRandomBigInteger,找到它的加载路径(类似[Loaded org.bouncycastle.util.test.TestRandomBigInteger from jar:file:/xxx/bc-xxx.jar!/]),确定该类所在的jar。
  • 用jarsigner验证jar签名:
    对找到的jar和同包其他类所在的jar,执行签名验证命令:
    jarsigner -verify -verbose -certs /path/to/target-bc.jar
    对比不同jar的签名者信息、证书链,确认是否存在签名不匹配的情况。
  • 检查jar的MANIFEST.MF文件:
    解压目标jar,查看META-INF/MANIFEST.MF中的签名相关字段(如Signature-Version、Created-By等),对比不同jar的字段是否一致。

三、额外解决建议

  • 强制统一BC版本:
    在根项目的build.gradle中添加版本强制规则,确保所有依赖使用指定版本的BC包:
    configurations.all {
        resolutionStrategy {
            force 'org.bouncycastle:bc-fips:1.0.1'
            force 'org.bouncycastle:bcpkix-fips:1.0.3'
        }
    }
    
  • 清理Gradle缓存:
    执行./gradlew clean build --no-build-cache,清除可能残留的旧版本jar缓存。
  • 检查测试任务的自定义类路径:
    确认测试任务配置中有没有通过classpath、from等方式额外引入的jar,比如:
    test {
        classpath files('libs/some-jar.jar')
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 04:52:23