天天看點

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

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:
[email protected]
]
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessors(AbstractAutowireCapableBeanFactory.java:)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$(AbstractBeanFactory.java:)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:)
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:)
    at java.util.concurrent.FutureTask.run(FutureTask.java:)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:)
    at java.lang.Thread.run(Thread.java:)
Caused by: java.lang.IllegalStateException: Failed to introspect Class [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean] from ClassLoader [ParallelWebappClassLoader
  context: ROOT
  delegate: false
----------> Parent Classloader:
[email protected]
]
    at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:)
    at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:)
    at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:)
    ...  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:)
    at java.lang.ClassLoader.preDefineClass(ClassLoader.java:)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:)
    at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:)
    at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:)
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:)
    at java.lang.Class.getDeclaredMethods(Class.java:)
    at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:)
    ...  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