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.persistence
了eclipselink
但排除了它试图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