【问题标题】:Error including bouncycastle provider包括 bouncycastle 提供程序的错误
【发布时间】:2020-11-19 15:47:11
【问题描述】:

我需要在我的项目中使用bouncycastle provider 库。

我已将其包含在 gradle 项目中。

apply plugin: 'application'
sourceCompatibility = '1.6'
version = '1.0.0'
mainClassName = 'path.to.main.file'

    dependencies {
        compile "org.mariadb.jdbc:mariadb-java-client:+"
        compile "org.bouncycastle:bcprov-jdk16:+"
        compile "commons-codec:commons-codec:+"
        testCompile "junit:junit:+"
    }

项目构建成功。但是当我尝试运行该项目时。找不到bouncycastle

Exception in thread "main" java.lang.NoClassDefFoundError: org/bouncycastle/jce/provider/BouncyCastleProvider
    at com.example.Server.main(Server.java:50)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Caused by: java.lang.ClassNotFoundException: org.bouncycastle.jce.provider.BouncyCastleProvider
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 6 more

我该如何解决?

【问题讨论】:

  • 错误的依赖。没有 bcprov-jdk16。应该是 bcprov-jdk15on
  • @JamesKPolk 你错了,有。直到版本 1.46,所以发现了一些东西。但在最近的版本中不是,正如我已经在下面写的那样。

标签: java gradle bouncycastle


【解决方案1】:

您可能没有正确运行您的应用程序。
如果您只是使用 java -jar foo.jar 运行创建的 JAR,您会错过运行时的所有依赖项。
您必须将这些依赖项添加到您的类路径中。

您有多种方法可以做到这一点。
例如。您可以创建一个胖 JAR,其中所有依赖项都使用一些 Gradle 插件重新打包到最终 JAR 中(有几个,但我根本不喜欢这个解决方案,所以我不能推荐一个)。
或者你可以 e。 G。应用application 插件,然后您可以使用run 任务来正确运行您的应用程序并使用distZip 任务来获得与您的应用程序、所有依赖项和启动脚本一起正确设置运行时的现成分发ZIP类路径。
或者你可以 e。 G。手动使用java -cp foo.jar;other.jar;another.jar your.main.Class

【讨论】:

  • 我已经编辑了这个问题。我仍然得到同样的错误。我将插件设为application,并指定了主文件的路径。
  • 但你还是会java -jar foo.jar,不是吗?这不是我告诉你的,application 插件的文档告诉你的。
  • 我正在使用Android Studio 中的run 任务来运行应用程序。
  • 您手动构建的运行配置,其中缺少库,因为您没有将模块定义与 Gradle 文件更改同步,因此缺少依赖关系,或者 Gradle run 任务超出Gradle 工具窗口?
  • 我在“Gradle Projects”窗口的应用程序下运行gradle运行任务。
【解决方案2】:

我遇到了同样的问题,并通过检查 BouncyCastleProvider 类是否已加载到 JVM 中得到解决。 IF not 然后只加载BouncyCastleProvider 类。

部署在服务器上的一些其他应用程序已经加载了BouncyCastleProvider 类的场景。当您部署另一个 war 文件并加载相同的类时,这会导致以下异常:

HTTP Status 500 – Internal Server Error
Type Exception Report

Message org.glassfish.jersey.server.ContainerException: java.lang.NoClassDefFoundError: org/bouncycastle/jce/provider/BouncyCastleProvider

Description The server encountered an unexpected condition that prevented it from fulfilling the request.

Exception

javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: java.lang.NoClassDefFoundError: org/bouncycastle/jce/provider/BouncyCastleProvider
    org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:432)
    org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:370)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:389)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:342)
    org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:229)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
Root Cause

org.glassfish.jersey.server.ContainerException: java.lang.NoClassDefFoundError: org/bouncycastle/jce/provider/BouncyCastleProvider
    org.glassfish.jersey.servlet.internal.ResponseWriter.rethrow(ResponseWriter.java:278)

执行以下代码时出现问题:

static {
    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
}

解决方案:

static {
    addBCProvider();
    //Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
}
public static void addBCProvider() {
    // java.security.NoSuchProviderException: no such provider: BC
    if (Security.getProvider(org.bouncycastle.jce.provider.BouncyCastleProvider.PROVIDER_NAME) == null) {
        System.out.println("JVM Installing BouncyCastle Security Providers to the Runtime");
        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
    } else {
        System.out.println("JVM Installed with BouncyCastle Security Providers");
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 2021-09-30
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多