Home
img of docs

在 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

接下来,我们详细说明一下具体的操作。

🔧 具体操作步骤

  1. 排除依赖并引入新版本 在你的 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>
  2. 使用依赖管理统一版本(可选但推荐) 如果你的项目结构复杂,模块众多,强烈建议在顶层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>
  3. 清理和重建 完成上述配置后,务必执行清理和重建命令,以确保所有更改生效。

       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版本,并对它们也进行排除。

Related Posts

There are no related posts yet. 😢