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

JavaFX数字签名应用编译镜像时抛出NoClassDefFoundError问题

JavaFX文档签名应用BouncyCastle依赖打包问题解决

问题现象与背景

  • IDE(IntelliJ IDEA)中运行应用完全正常,但执行./gradlew clean jlinkZip打包后,通过bin/app.bat运行时抛出java.lang.NoClassDefFoundError: org/bouncycastle/cert/X509CertificateHolder
  • 核心异常:找不到X509CertificateHolder类,该类属于BouncyCastle的bcpkix模块
  • 额外问题:仅Gradle编译时出现模块重复错误,IDE运行无此问题;添加bcpkix依赖后镜像大小未增加,怀疑依赖未被打包进镜像

相关配置信息

  1. build.gradle依赖配置:已引入itextpdf 5.5.13.3、bcprov-jdk15to18 1.70、bcpkix-jdk15on 1.70(因模块重复问题排除了bcpkix中的bcprov-jdk15on)
  2. module-info.java:声明了javafx.controls、javafx.fxml、itextpdf等依赖模块
  3. 报错触发代码:
    MakeSignature.signDetached(appearance, bouncyCastleDigest, privateKeySignature, chain, null, null, null, 0, MakeSignature.CryptoStandard.CMS);
    

解决方案

1. 修正Gradle依赖配置,确保依赖传递正确

修改build.gradle中的依赖块,明确标记依赖类型并确保重复模块排除生效:

dependencies {
    implementation 'com.itextpdf:itextpdf:5.5.13.3'
    implementation 'org.bouncycastle:bcprov-jdk15to18:1.70'
    implementation('org.bouncycastle:bcpkix-jdk15on:1.70') {
        exclude group: 'org.bouncycastle', module: 'bcprov-jdk15on'
    }
}

2. 配置jlink任务强制包含BouncyCastle模块

jlink默认仅打包应用直接依赖的模块,需手动指定添加BouncyCastle模块。在build.gradle的jlink任务中添加参数:

jlink {
    // 保留原有配置,新增以下内容
    jvmArgs = ['--add-modules', 'org.bouncycastle.provider,org.bouncycastle.pkix']
    // 若使用自动模块(非模块化版本),替换为:
    // jvmArgs = ['--add-modules', 'bcprov,bcpkix']
}

3. 完善module-info.java的模块依赖声明

根据BouncyCastle的模块类型,在module-info.java中添加对应依赖:

module your.application.module.name {
    requires javafx.controls;
    requires javafx.fxml;
    requires itextpdf;
    // 模块化版本依赖
    requires org.bouncycastle.provider;
    requires org.bouncycastle.pkix;
    // 自动模块版本依赖(若使用非模块化BC库)
    // requires bcprov;
    // requires bcpkix;
}

4. 解决Gradle编译时的模块重复问题

添加版本强制策略,确保整个依赖树中仅使用指定版本的bcprov:

configurations.all {
    resolutionStrategy.force 'org.bouncycastle:bcprov-jdk15to18:1.70'
}

5. 验证依赖打包结果

执行jlink后,检查镜像目录下的modules文件夹,确认存在org.bouncycastle.provider、org.bouncycastle.pkix(或bcprov、bcpkix)模块文件,以此确认依赖已被正确打包。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 08:52:19