我需要在我的项目中使用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
我该如何解决?
答案 0 :(得分:2)
您可能无法正确运行您的应用程序
如果您只使用java -jar foo.jar
运行创建的JAR,则会在运行时错过所有依赖项
您必须将这些依赖项添加到类路径中。
你有多种方法可以做到这一点
E. g。你可以用一些Gradle插件创建一个胖JAR,其中所有依赖关系被重新打包到最终的JAR中(有几个,但我根本不喜欢这个解决方案,所以我不能推荐一个)。
或者你可以。 G。应用application
插件,然后您可以使用run
任务正确运行您的应用程序并使用distZip
任务获取与您的应用程序,所有依赖项的现成分发ZIP并开始正确设置运行时类路径的脚本
或者你可以。 G。使用java -cp foo.jar;other.jar;another.jar your.main.Class
手动执行此操作。
答案 1 :(得分:1)
BouncyCastle需要注册为安全提供商
Security.addProvider( new BouncyCastleProvider() );
答案 2 :(得分:0)
我遇到了同样的问题,并通过检查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)
在执行以下代码时发生的问题:
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");
}
}