EclipseLink 2.7.0和JPA API 2.2.0 – 签名不匹配

运行由maven构建的具有以下依赖项的项目时:

 org.eclipse.persistence javax.persistence 2.2.0   org.eclipse.persistence eclipselink 2.7.0  

我在运行时收到以下错误:

 java.lang.SecurityException: class "javax.persistence.Cacheable"'s signer information does not match signer information of other classes in the same package 

javax.persistence-2.2.0工件已签名并包含javax.persistence.Cacheable.class注释,而eclipselink-2.7.0工件签名且包含相同的java类注释。

怎么解决这个问题?

编辑

用版本2.1.1替换javax.persistence工件版本2.2.0修复了问题(这个没有签名),但我不确定这是正常情况。

谢谢Stéphane – 问题末尾的编辑帮助我“修复”了同样的问题。 对于其他人来说也是如此 – 这是一个扩展的答案。 这就是你需要“修复”pom中的东西(直到Eclipse正确修复):

   org.eclipse.persistence eclipselink 2.7.0   org.eclipse.persistence javax.persistence     org.eclipse.persistence javax.persistence 2.1.1  

javax.persistenceeclipselink但排除了它试图javax.persistence依赖,并将其替换为没有签名问题的早期版本的javax.persistence

另外: javax.persistence版本2.2.0明确地被javax.persistence原始问题中显示的pom片段,尽管已经是eclipselink的传递依赖。

说明

总结 – eclipselink工件依赖于javax.persistence并且都包含javax.persistence包中的类。 然而, javax.persistence jar是签名而javax.persistence jar不是。 因此,当从eclipselink jar中的包javax.persistence加载一个类时,Java运行时会抱怨它缺少签名与已经从javax.persistence jar中的同一个包加载的类不匹配。

详细信息 – 如果我在条件为"javax.persistence".equals(arg0) java.util.concurrent.ConcurrentHashMap.putIfAbsent(K, V)放置一个断点,那么我看到javax.persistence被映射到以下CodeSource值:

 (file:/Users/georgehawkins/.m2/repository/org/eclipse/persistence/javax.persistence/2.2.0/javax.persistence-2.2.0.jar [ [ Version: V3 Subject: CN="Eclipse Foundation, Inc.", OU=IT, O="Eclipse Foundation, Inc.", L=Ottawa, ST=Ontario, C=CA Signature Algorithm: SHA256withRSA, OID = 1.2.840.113549.1.1.11 ... 

javax.persistence-2.2.0.jar由Eclipse Foundation签名,包含javax.persistence包中的类。 当我的应用程序的某些部分(实际上是Spring逻辑中的某些东西)试图加载javax.persistence.EntityManagerFactory时,这个jar被拉入。

如果我在throw new SecurityException行的java.lang.ClassLoader.checkCerts(String, CodeSource)放置一个断点,那么当传入的CodeSource为:时,它会看到它击中此行:

 (file:/Users/georgehawkins/.m2/repository/org/eclipse/persistence/eclipselink/2.7.0/eclipselink-2.7.0.jar ) 

eclipselink-2.7.0.jar也包含javax.persistence包中的类,但它是无符号的,因此发生冲突会导致抛出SecurityException 。 当某些事情(也在Spring逻辑中很深)试图加载javax.persistence.PersistenceUtil时会发生这种情况。

如果我看一下mvn dependency:tree的输出mvn dependency:tree我看到这种不匹配似乎归结为eclipselink本身 – 它正在org.eclipse.persistence:javax.persistence:jar:2.2.0本身。 也就是说,它不是与其他依赖的冲突:

 [INFO] | \- org.eclipse.persistence:eclipselink:jar:2.7.0:compile [INFO] | +- org.eclipse.persistence:javax.persistence:jar:2.2.0:compile [INFO] | +- org.eclipse.persistence:commonj.sdo:jar:2.1.1:compile [INFO] | +- javax.validation:validation-api:jar:1.1.0.Final:compile [INFO] | \- org.glassfish:javax.json:jar:1.0.4:compile 

我现在已经在bugs.eclipse.org上记录了这个 – 请参阅错误525457 。

要解决此问题,请在maven pom文件中为EclipseLink 2.7.x添加正确的JPA 2.2兼容依赖项,如下所示:

  org.eclipse.persistence org.eclipse.persistence.jpa 2.7.1  

eclipselink.jar本身被设计为一体化的捆绑包,而不是osgi启用的jar包含eclipselink项目的所有部分(即sdo,oracle db特定的东西,dbws,nosql ..),能够在类路径上运行jpa api 2.0 – 至少在2.x版本中。 在许多情况下,这不是必需的,可以使用适当的组件,例如org.eclipse.persistence.jpa,org.eclipse.persistence.oracle等。有关完整列表,请参阅ie: http : //search.maven.org /#search%7Cga%7C1%7Corg.eclipse.persistence

我通过切换jar在类路径中出现的顺序来解决这个问题。 就我而言,我正在使用Tomcat并且必须修改catalina.properties以在eclipselink之前放置javax。

奥宾娜的回答是正确的; 我想,eclipselink 2.7.x存在问题 – 乔治表示。 升级eclipselink时我遇到了类似的问题,但它只是错误的人工制品。 最初描述的问题似乎是外部引用javax.persistence级别的结果 – 它绝对没有必要。

正确的maven配置可以在eclipselink wiki中找到: https ://wiki.eclipse.org/EclipseLink/Maven