java.lang.NoClassDefFoundError:无法初始化类javax.crypto.JceSecurityManager

时间:2015-03-27 13:05:31

标签: spring-mvc

java.lang.NoClassDefFoundError: Could not initialize class javax.crypto.JceSecurityManager
    javax.crypto.Cipher.getConfiguredPermission(Cipher.java:2543)
    javax.crypto.Cipher.getMaxAllowedKeyLength(Cipher.java:2567)
    sun.security.ssl.CipherSuite$BulkCipher.isAvailable(CipherSuite.java:548)
    sun.security.ssl.CipherSuite$BulkCipher.isAvailable(CipherSuite.java:527)
    sun.security.ssl.CipherSuite.isAvailable(CipherSuite.java:194)
    sun.security.ssl.SSLContextImpl.getApplicableCipherSuiteList(SSLContextImpl.java:350)
    sun.security.ssl.SSLContextImpl.getDefaultCipherSuiteList(SSLContextImpl.java:308)
    sun.security.ssl.SSLSocketImpl.init(SSLSocketImpl.java:607)
    sun.security.ssl.SSLSocketImpl.<init>(SSLSocketImpl.java:549)
    sun.security.ssl.SSLSocketFactoryImpl.createSocket(SSLSocketFactoryImpl.java:110)
    com.sun.mail.util.SocketFetcher.startTLS(SocketFetcher.java:428)
    com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:1647)
    com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:534)
    javax.mail.Service.connect(Service.java:291)
    org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:389)
    org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:340)
    org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:355)
    org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:344)
    net.codejava.spring.SendEmailAttachController.sendEmail(SendEmailAttachController.java:41)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:483)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:440)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:428)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:919)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:851)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:855)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

5 个答案:

答案 0 :(得分:10)

确保执行JRE的以下文件未被损坏/修改/删除。

  • JRE \ lib \ security中\ local_policy.jar
  • JRE \ lib \ security中\的US_export_policy.jar

我遇到了类似的问题,这是由于从不同的java版本手动复制这两个文件引起的。 用原始文件替换后解决。

答案 1 :(得分:2)

如果您使用的是Java 8 Update 151(8u151)或更高版本,请同时检查this

  

新功能新的安全性属性可控制加密策略

     

此版本引入了一项新功能,可通过新的Security属性控制JDK使用的JCE管辖策略文件。在较早的版本中,必须分别下载和安装JCE管辖区文件,以允许JDK使用不受限制的加密技术。不再需要下载和安装步骤。 要启用无限制的加密,可以使用新的crypto.policy Security属性。如果在java.security文件中设置了新的Security属性(crypto.policy),或者已通过使用在初始化JCE框架之前调用Security.setProperty(),该设置将被接受。默认情况下,该属性是未定义的。如果未定义属性,并且旧版JCE管辖区文件在旧版lib / security目录中不存在,则默认密码级别将保持为“受限”。要将JDK配置为使用无限加密,请将crypto.policy设置为'unlimited'的值。有关更多信息,请参见此发行版随附的java.security文件中的注释。

     

注意:在Solaris上,建议先删除旧的SVR4软件包,然后再安装新的JDK更新。如果要在6u131、7u121、8u111之前的JDK版本上进行基于SVR4的升级(不卸载旧软件包),则应在java.security文件中设置新的crypto.policy Security属性。

     

由于旧的JCE管辖区文件保留在/ lib / security中,因此它们可能不符合最新的安全JAR签名标准,这些标准在6u131、7u121、8u111和更高版本中进行了更新。如果使用旧文件,可能会看到类似于以下的异常:

答案 2 :(得分:1)

当我尝试使用IntelliJ 14连接到数据库时,发生了这种情况。

我玩过我的jre \ lib \ security \ local_policy.jar和jre \ lib \ security \ US_export_policy.jar文件

我通过以下方式解决了这个问题:

  1. 安装新的JDK
  2. 指向IntelliJ使用此新JDK
  3. 将JAVA_HOME设置为此新JDK
  4. 重启IntelliJ

答案 3 :(得分:0)

请尝试以下步骤:

  1. 卸载所有旧版本的Java,并只保留一个版本(最好是最新版本的JDK)
  2. 如果设置了旧java环境路径的手动条目,请将其删除,例如)JAVA_HOME,PATH
  3. 将IDE(例如Eclipse)指向最新版本的JDK
  4. 如果先前通过手动步骤修改
  5. ,则恢复到JDK / JRE中的原始jar文件
  6. 点击系统/ PC上的java安装中的“检查更新”

答案 4 :(得分:0)

我尝试在library/openjdk:9 Docker容器中运行Maven时遇到此问题。我通过在https://jdk9.java.net/download/从Oracle获取Java 9 JDK并设置JAVA_HOME,以与其他评论者相同的方式解决了问题。似乎这两个jar文件(在其他答案中提到)在Docker镜像中不存在。