EclipseLink 2.7.0 和 JPA API 2.2.0 - 签名不匹配
Posted
技术标签:
【中文标题】EclipseLink 2.7.0 和 JPA API 2.2.0 - 签名不匹配【英文标题】:EclipseLink 2.7.0 and JPA API 2.2.0 - signature mismatch 【发布时间】:2018-02-02 21:00:48 【问题描述】:运行maven构建的项目时,具有以下依赖项:
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>javax.persistence</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>2.7.0</version>
</dependency>
我在运行时收到以下错误:
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类注释。
如何解决这个问题?
编辑
将 javax.persistence 工件版本 2.2.0 替换为 2.1.1 版本可以解决问题(这个没有签名),但我不确定这是不是正常情况。
【问题讨论】:
我也有类似的问题。我根本没有在 pom.xml 中单独列出 javax.persistence 包。它是通过 eclipselink 继承的,也许还有 javaee-api 之类的东西。在我的构建中,错误是: 引起:java.lang.SecurityException:类“javax.persistence.Access”的签名者信息与同一包中其他类的签名者信息不匹配。我使用了这个解决方法:我从一些不同的提供程序完全下载了一个 javax.persistence jar,然后将其导入到名为 org.eclipse.persistence:javax.persistence 的 maven 存储库中。 谢谢,用 2.1.1 替换 2.2.1 确实有效。 【参考方案1】:感谢 Stéphane - 您问题末尾的编辑帮助我“解决”了同样的问题。对于其他也遇到此问题的人-这是一个扩展的答案。这就是你需要在你的 pom 中“修复”一些东西(直到 Eclipse 正确修复这些东西):
<!-- See https://***.com/q/45870753 -->
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>2.7.0</version>
<exclusions>
<exclusion>
<groupId>org.eclipse.persistence</groupId>
<artifactId>javax.persistence</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>javax.persistence</artifactId>
<version>2.1.1</version>
</dependency>
这会引入eclipselink
,但会排除它尝试引入的javax.persistence
依赖项,并将其替换为不存在签名问题的早期版本的javax.persistence
。
除此之外:javax.persistence
版本 2.2.0
在原始问题中显示的 pom 片段中被显式拉入,尽管它已经是 eclipselink
的传递依赖项。
说明
总结 - eclipselink
工件依赖于 javax.persistence
并且两者都包含包 javax.persistence
中的类。但是,javax.persistence
jar 已签名,而 eclipselink
未签名。因此,当从 eclipselink
jar 中的包 javax.persistence
加载类时,Java 运行时会抱怨它缺少签名与已经从 javax.persistence
jar 中的同一包中加载的类不匹配。
详细信息 - 如果我在 java.util.concurrent.ConcurrentHashMap.putIfAbsent(K, V)
中放置一个断点,条件为 "javax.persistence".equals(arg0)
,那么我看到 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 基金会签名,包含 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 <no signer certificates>)
即eclipselink-2.7.0.jar
还包含 javax.persistence
包中的类,但它是未签名的,因此会发生冲突,导致抛出 SecurityException
。当某些东西(也在 Spring 逻辑中)尝试加载 javax.persistence.PersistenceUtil
时,就会发生这种情况。
如果我查看mvn dependency:tree
的输出,我发现这种不匹配似乎归结为eclipselink
本身——它正在拉入org.eclipse.persistence:javax.persistence:jar:2.2.0
本身。 IE。它与其他依赖项没有冲突:
[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。
【讨论】:
其他解决方法是将依赖关系切换到“org.eclipse.persistence:org.eclipse.persistence.jpa:2.7.1”。它不会带来 javax.persistence。 谢尔盖所说的对我来说似乎不仅仅是一种解决方法,而是实际的解决方案。他们对提交的错误 525457 做出了同样的回应。 我尝试了排除方法,但没有奏效;需要明确的是,Sergey 给出的解决方案对我有用(谢谢,顺便说一句)不仅涉及更改版本,还涉及更改 artifactId(从 javax.persistence 到 org.eclipse.persistence.jpa)。【参考方案2】:要解决此问题,请将 EclipseLink 2.7.x 的正确 JPA 2.2 兼容依赖项放入您的 maven pom 文件中,如下所示:
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>org.eclipse.persistence.jpa</artifactId>
<version>2.7.1</version>
</dependency>
【讨论】:
我花了一段时间才意识到这确实是答案。我只使用 JPA 支持,不需要“eclipselink”工件。【参考方案3】:我通过切换 jar 在类路径中出现的顺序来解决这个问题。就我而言,我使用的是 Tomcat,并且必须修改 catalina.properties 以将 javax 放在 eclipselink 之前。
【讨论】:
【参考方案4】:eclipselink.jar 本身被设计为一体式捆绑包,而不是启用 osgi 的 jar,其中包含 eclipselink 项目的所有部分(即 sdo、oracle db 特定的东西、dbws、nosql..),能够与 jpa api 2.0 一起运行在类路径上 - 至少在 2.x 版本中。在许多情况下,这不是必需的,可以使用适当的组件来代替,例如 org.eclipse.persistence.jpa、org.eclipse.persistence.oracle 等。完整列表请参见:http://search.maven.org/#search%7Cga%7C1%7Corg.eclipse.persistence
【讨论】:
【参考方案5】:Obinna 的回答是正确的;我猜 eclipselink 2.7.x 存在问题——正如 George 指出的那样。升级 eclipselink 时我遇到了类似的问题,但这只是错误的人工制品。最初描述的问题似乎是外部引用 javax.persistence 级别的结果 - 这绝对没有必要。
可以在 eclipselink wiki 中找到正确的 maven 配置: https://wiki.eclipse.org/EclipseLink/Maven
【讨论】:
【参考方案6】:我也遇到了这个问题,我的情况有点不同,因为我没有使用 Maven。但是,我在这里给出一个答案,因为它可能会让人们了解如何在自己的情况下处理这个问题。毕竟,标题是关于这种不匹配的,一般来说,一个子案例是使用 Maven 时。
我在 NetBeans 项目中使用 eclipselink。最初,我将 eclipselink jar 文件 (eclipselink-2.7.0.jar
) 和所需的 org.eclipse.persistence jar 文件作为外部库放置到我的项目中。上面Sergey 和entreprenr 的评论实际上是引导我解决问题的原因。我要做的是创建一个新库(工具->库->新库...),它 not 包含 eclipselink jar 文件(即 eclipselink-2.7.0.jar
未添加到库中) ,只有项目所需的特定 org.eclipse.persistence jar 文件,例如org.eclipse.persistence.antlr-2.7.0.jar
、org.eclipse.persistence.asm-2.7.0.jar
、org.eclipse.persistence.core-2.7.0.jar
、org.eclipse.persistence.jpa.modelgen.processor-2.7.0.jar
、org.eclipse.persistence.jpa-2.7.0.jar
等。然后我将这个库添加到我的项目中,异常消失了。
当然,我还必须将我服务器上的所有 org.eclipse.persistence jar 文件替换为其 2.7.0 版本,并将javax.persistence.jar
替换为其 2.2.0 版本(我使用 payara,所以这些位于在<payara_home>\glassfish\modules
).
【讨论】:
【参考方案7】:这种奇怪的情况似乎仍然存在,在我的情况下没有使用 Maven,只是试图让一个简单的 JPA 示例运行(如果你需要几个小时来实现它,那真的很令人沮丧)。
对于 1 月的 2.7.4,如果您将 eclipselink.jar 和 jakarta.persistence_2.2.2.jar 从 zip 放在类路径中,则会发生此错误。
最终的解决方案是更改类路径上的顺序:首先是 jakarta-persistence,然后才是 eclipselink-jar。 所以所有 javax.persistence 类都取自 jakarta-jar,而不是 eclipselink-jar 的一部分(如果包含在那里)。
所以我真的很想知道各种各样的事情。
eclipselink 包应该是一体的?但事实并非如此。包含一些 javax.persistence 类。其他不是 - 在 JPA 代码中使用的基本类,如 EntityManager。当然,与包含在 zip 中的 jakarta-jar 一起它是完整的 - 但您可能不会将这两个 jar 与类路径上的“错误”顺序一起使用!?我真的认为这是一个错误 - 或者至少应该在包中对此有一个巨大的提示。
这里建议的 Maven 的 org.eclipse.persistence.jpa-2.7.4.jar 是什么?它没有eclipselink.jar的问题是的,不是这个错误信息。但它似乎也只是不包括 Eclipselink JPA 实现,至少在运行它时我得到错误代码中引用的持久性单元不存在(与 eclipselink.jar 相同的持久性.xml)。
奇怪的情况。
【讨论】:
【参考方案8】:我在我的项目构建中使用 gradle 来解决我也遇到过的 OP 问题,我最终使用了以下工作设置。
dependencies
testImplementation(group: 'org.eclipse.persistence', name: 'eclipselink', version: '2.7.4')
exclude group: 'javax.validation', module: 'validation-api'
exclude group: 'org.eclipse.persistence', module: 'javax.persistence'
exclude group: 'org.eclipse.persistence', module: 'commonj.sdo'
exclude group: 'org.eclipse.persistence', module: 'jakarta.persistence'
testImplementation(group: 'org.eclipse.persistence', name: 'org.eclipse.persistence.jpa', version: '2.7.4')
exclude group: 'org.eclipse.persistence', module: 'jakarta.persistence'
您当然可以使用您想要或需要的任何依赖类型来代替“testImplementation”。
在阅读了 Sergey 的评论后,我通过以下方式改进了这一点:
dependencies
testImplementation group: 'org.eclipse.persistence', name: 'org.eclipse.persistence.jpa', version: '2.7.4'
我认为最后一个是最好的解决方案。
【讨论】:
【参考方案9】:我的项目在 JDK-8 上运行,但当我将其升级到 openJDK-11 时停止运行。
我解决了它,不包括jpa-persistence
模块,并在版本2.2
上再次添加:
dependencies.create('org.eclipse.persistence:eclipselink:2.7.4')
exclude module: "javax.persistence"
,
'javax.persistence:javax.persistence-api:2.2', //add it again, manually
'org.eclipse.persistence:org.eclipse.persistence.asm:2.7.4',
'org.eclipse.persistence:org.eclipse.persistence.antlr:2.7.4',
'org.eclipse.persistence:org.eclipse.persistence.moxy:2.7.4',
'org.eclipse.persistence:org.eclipse.persistence.core:2.7.4'
【讨论】:
【参考方案10】:因为我只使用Tomcat时找不到这个问题的答案,而且这个线程经常与这个问题相关联,所以我将在这里发布我的解决方案:
由于签名在 MANIFEST.MF 中,您可以使用 7zip 或 WinRAR 更改 .jar 文件中的签名以打开它们,或者干脆从两个 .jar 的 META-INF 文件中删除它们,然后将更改的文件导入到你骑。
签名不匹配问题的一个有用线程是这个线程:Java SecurityException: signer information does not match
【讨论】:
以上是关于EclipseLink 2.7.0 和 JPA API 2.2.0 - 签名不匹配的主要内容,如果未能解决你的问题,请参考以下文章
同一应用程序中的 JPA/Eclipselink 和 JDBC 连接
JPA 使用指南 /Eclipselink/JPA 实体生成器