Java 包含bouncycastle提供程序时出错

Java 包含bouncycastle提供程序时出错,java,gradle,bouncycastle,Java,Gradle,Bouncycastle,我需要在我的项目中使用bouncycastleprovider库 我把它包括在gradle项目中 apply plugin: 'application' sourceCompatibility = '1.6' version = '1.0.0' mainClassName = 'path.to.main.file' dependencies { compile "org.mariadb.jdbc:mariadb-java-client:+" compil

我需要在我的项目中使用
bouncycastleprovider

我把它包括在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

如何修复它?

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

您有多种方法来实现此目的。
例如。您可以创建一个胖JAR,其中所有依赖项都将通过一些Gradle插件重新打包到最终的JAR中(有几个,但我一点也不喜欢这个解决方案,因此我无法重新编译一个)。
或者你也可以。G应用
应用程序
插件,然后您可以使用
运行
任务正确运行您的应用程序,并使用
distZip
任务为您的应用程序、所有依赖项以及正确设置运行时类路径的启动脚本获取现成的分发压缩文件。

或者你也可以。G使用
java-cpfoo.jar手动完成;other.jar;另一个.jar您的.main.Class
我也遇到了同样的问题,通过检查
BouncyCastleProvider
类是否加载到JVM中得到了解决。如果不是,则仅加载
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)
在排除以下代码时出现问题:

静态{
addProvider(新org.bouncycastle.jce.provider.BouncyCastleProvider());
}
解决方案:

静态{
addBCProvider();
//addProvider(新org.bouncycastle.jce.provider.BouncyCastleProvider());
}
公共静态void addBCProvider(){
//java.security.NoSuchProviderException:无此类提供程序:BC
if(Security.getProvider(org.bouncycastle.jce.provider.BouncyCastleProvider.provider\u NAME)==null){
System.out.println(“JVM将BouncyCastle安全提供程序安装到运行时”);
addProvider(新org.bouncycastle.jce.provider.BouncyCastleProvider());
}否则{
System.out.println(“安装了BouncyCastle安全提供程序的JVM”);
}
}

我已经编辑了这个问题。但我还是犯了同样的错误。我制作了
应用程序的插件
,并指定了主文件的路径。但是你仍然做
java-jar foo.jar
,不是吗?这不是我告诉你的,也不是
应用程序
插件的文档告诉你的。我正在使用
Android Studio
中的
运行
任务来运行该应用程序。您手动构建的运行配置缺少库,因为您没有将模块定义与渐变文件更改和更新同步是否缺少依赖项,或Gradle工具窗口中的Gradle
run
任务?我是从“Gradle项目”窗口中应用程序下的
Gradle
run任务运行的。依赖项错误。没有bcprov-jdk16。应该是bcprov-jdk15on@JamesKPolk你错了,是的。直到版本1.46,所以发现了一些东西。但在最近的版本中,我已经在下面写过了。