在 JDK 21 项目中引入 com.huawei.apigateway.java-sdk-core 时,运行期抛出 java.lang.NoSuchMethodError: org.bouncycastle.crypto.MultiBlockCipher org.bouncycastle.crypto.engines.AESEngine.newInstance() 异常
玖拾一
/ Question
/ c:
/ u:
/ 4 min read
一学一个不吱声
遇到的 NoSuchMethodError 通常是因为依赖项中包含了与当前JDK不兼容的、过时的 Bouncy Castle 库版本。在 JDK 21 环境下使用为 JDK 8 编译的 SDK 时,可能会发生这种版本冲突。下面是一个解决问题的思路汇总,可以参照处理:
| 问题根源 | 解决方案概览 | 关键步骤/命令 |
|---|---|---|
| 项目依赖了过时或与JDK 21不兼容的Bouncy Castle版本。 | 排除旧版本并引入兼容的新版本。 | 1. 在依赖中排除旧版BC。 2. 显式引入新版BC (如 bcprov-jdk18on)。 |
| 华为SDK可能内嵌了特定的Bouncy Castle。 | 使用依赖管理统一版本。 | 在 dependencyManagement 中强制指定BC版本。 |
| 构建工具缓存了旧的依赖。 | 清理构建工具的缓存。 | 执行 mvn clean install -U |
接下来,我们详细说明一下具体的操作。
🔧 具体操作步骤
-
排除依赖并引入新版本 在你的
pom.xml中,找到对com.huawei.apigateway:java-sdk-core的依赖声明,添加排除规则,并显式引入一个与 JDK 21 兼容的 Bouncy Castle 版本。<dependencies> <!-- 你的华为API网关SDK依赖 --> <dependency> <groupId>com.huawei.apigateway</groupId> <artifactId>java-sdk-core</artifactId> <version>3.2.4</version> <!-- 重点:排除其内嵌的旧版Bouncy Castle --> <exclusions> <exclusion> <groupId>org.bouncycastle</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> <!-- 显式引入与JDK 21兼容的Bouncy Castle版本 --> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk18on</artifactId> <!-- 注意:即使名称是jdk18on,通常也兼容更高版本JDK --> <version>1.78</version> <!-- 请使用最新的稳定版本 --> </dependency> <!-- 根据需要,可能还需要引入bcpkix等 --> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcpkix-jdk18on</artifactId> <version>1.78</version> </dependency> </dependencies> -
使用依赖管理统一版本(可选但推荐) 如果你的项目结构复杂,模块众多,强烈建议在顶层POM或
dependencyManagement中统一指定Bouncy Castle的版本,防止其他依赖再次引入旧版本。<dependencyManagement> <dependencies> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk18on</artifactId> <version>1.78</version> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcpkix-jdk18on</artifactId> <version>1.78</version> </dependency> </dependencies> </dependencyManagement> -
清理和重建 完成上述配置后,务必执行清理和重建命令,以确保所有更改生效。
mvn clean install -U这里的
-U参数强制 Maven 检查所有依赖的最新快照,有助于解决缓存问题。
💡 重要提示
- 版本选择:示例中使用了
bcprov-jdk18on。尽管名字包含 “jdk18”,但它通常能在 JDK 21 上良好运行。请务必查阅 Maven Central 以获取该组件最新的、与JDK 21验证过的版本。 - 代码注册:确保在你的代码中,在使用相关加密功能前,已经正确注册了 Bouncy Castle 提供者(通常在静态代码块中):
import org.bouncycastle.jce.provider.BouncyCastleProvider; // ... static { Security.addProvider(new BouncyCastleProvider()); } - 检查依赖树:如果问题依旧,可以使用
mvn dependency:tree -Dincludes=org.bouncycastle命令再次检查是否还有其他依赖引入了不兼容的Bouncy Castle版本,并对它们也进行排除。