java.lang.SecurityException: class "javax.persistence.SharedCacheMode"'s signer information does not

本文分析了Spring JPA环境下出现的SecurityException问题,详细解释了错误产生的原因,并提供了解决方案,包括调整依赖配置。

A: 完整异常栈:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory': Lookup method resolution failed; nested exception is java.lang.IllegalStateException: Failed to introspect Class [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean] from ClassLoader [ParallelWebappClassLoader
  context: ROOT
  delegate: false
----------> Parent Classloader:
java.net.URLClassLoader@1fb3ebeb
]
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:262)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessors(AbstractAutowireCapableBeanFactory.java:1204)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1129)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:503)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1089)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:859)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:409)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:291)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:103)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4792)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5256)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:754)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:730)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:985)
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1857)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalStateException: Failed to introspect Class [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean] from ClassLoader [ParallelWebappClassLoader
  context: ROOT
  delegate: false
----------> Parent Classloader:
java.net.URLClassLoader@1fb3ebeb
]
    at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:659)
    at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:556)
    at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:541)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:245)
    ... 27 more
Caused by: java.lang.SecurityException: class "javax.persistence.SharedCacheMode"'s signer information does not match signer information of other classes in the same package
    at java.lang.ClassLoader.checkCerts(ClassLoader.java:898)
    at java.lang.ClassLoader.preDefineClass(ClassLoader.java:668)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:761)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2339)
    at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:829)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1278)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1137)
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
    at java.lang.Class.getDeclaredMethods(Class.java:1975)
    at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:641)
    ... 30 more

也可能提示:
java.lang.SecurityException: class “javax.persistence.ValidationMode“‘s signer information does not match signer information of other classes in the same package

B: 环境
jdk= 1.8.0_121-b13
tomcat= Apache Tomcat/8.5.32
spring framework= 5.0.7.RELEASE
jpa= 2.2.0
jpa.dialect= eclipselink 2.7.1

都是按spring framework编译环境定义的库版本:build.gradle

C: 原因分析
一开始我依赖的是eclipselink.jar,这是一个完整包,里面包含部分javax.persistence-2.2.0.jar代码

        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>eclipselink</artifactId>
            <version>2.7.1</version>
        </dependency>

同时它还需要依赖javax.persistence-2.2.0.jar, 这会导致两个jar中同时有:
javax.persistence.ValidationMode 和 javax.persistence.SharedCacheMode,…

D: 解决方法
在实体项目中(项目作了拆分,实体一个项目,接口一个项目,接口实现一个项目),只依赖:

        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>javax.persistence</artifactId>
            <version>2.2.0</version>
        </dependency>

接口实现项目中依赖的eclipselink改用:

        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>org.eclipse.persistence.jpa</artifactId>
            <version>2.7.1</version>
        </dependency>

这时jar由一个(eclipselink.jar)变成了5个jar,分别如下:
org.eclipse.persistence.core-2.7.1.jar
org.eclipse.persistence.jpa.jpql-2.7.1.jar
org.eclipse.persistence.antlr-2.7.1.jar
org.eclipse.persistence.asm-2.7.1.jar
org.eclipse.persistence.jpa-2.7.1.jar

Java 出现 `java.lang.ExceptionInInitializerError` 且由 `java.lang.SecurityException`(类 `"org.bouncycastle.jcajce.provider.asymmetric.DSTU4145$Mappings"` 的签名信息与同一包中其他类的签名信息不匹配)引发时,可尝试以下解决方法: ### 1. 检查 JAR 包版本 `java.lang.SecurityException` 通常是由于 JAR 包版本不一致导致的。不同版本的 Bouncy Castle 库可能会有不同的签名,混合使用不同版本的 JAR 包会造成签名信息不匹配。 要确保项目中使用的所有 Bouncy Castle 相关 JAR 包版本一致。例如,若使用 `bcprov-jdk15on-154.jar`,则项目中所有 Bouncy Castle 库都应是 154 版本。可以在项目的依赖管理文件(如 Maven 的 `pom.xml` 或 Gradle 的 `build.gradle`)中检查和统一版本。 Maven 示例: ```xml <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.54</version> </dependency> ``` Gradle 示例: ```groovy implementation 'org.bouncycastle:bcprov-jdk15on:1.54' ``` ### 2. 清除缓存并重新构建项目 有时,构建工具的缓存可能会保存旧的或损坏的 JAR 包信息,从而导致签名验证失败。可以清除项目的构建缓存并重新构建项目。 - **Maven**:在项目根目录下运行 `mvn clean install` 命令。 - **Gradle**:在项目根目录下运行 `gradle clean build` 命令。 ### 3. 手动删除并重新下载 JAR 包 手动删除本地仓库中所有 Bouncy Castle 相关的 JAR 包,然后重新下载。 - **Maven**:本地仓库默认位于 `~/.m2/repository`,在该目录下找到 `org/bouncycastle` 文件夹并删除,之后重新构建项目,Maven 会自动重新下载所需的 JAR 包。 - **Gradle**:本地仓库默认位于 `~/.gradle/caches`,可以删除该目录下的相关缓存文件,然后重新构建项目。 ### 4. 检查类路径 确保类路径中没有重复的 Bouncy Castle JAR 包。重复的 JAR 包可能会导致类加载冲突和签名验证问题。可以通过打印类路径信息来检查: ```java System.out.println(System.getProperty("java.class.path")); ``` 检查输出中是否有重复的 Bouncy Castle JAR 包,并从类路径中移除多余的 JAR 包。 ### 5. 检查 JAR 包完整性 下载的 JAR 包可能在传输过程中损坏,导致签名信息不匹配。可以从官方渠道重新下载 Bouncy Castle 相关的 JAR 包,并替换项目中现有的 JAR 包。Bouncy Castle 的官方下载地址为:https://www.bouncycastle.org/latest_releases.html 。 ### 6. 检查安全策略 某些安全策略可能会影响 JAR 包的签名验证。检查项目的安全策略文件(如 `java.policy`),确保没有设置过于严格的安全策略,导致签名验证失败。 ### 7. 禁用签名验证(不推荐) 作为最后的手段,可以尝试禁用签名验证。但这会降低项目的安全性,不建议在生产环境中使用。可以通过设置系统属性来禁用签名验证: ```java System.setProperty("java.security.disableJarVerification", "true"); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值