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.jarorg.eclipse.persistence.asm-2.7.0.jarorg.eclipse.persistence.core-2.7.0.jarorg.eclipse.persistence.jpa.modelgen.processor-2.7.0.jarorg.eclipse.persistence.jpa-2.7.0.jar 等。然后我将这个库添加到我的项目中,异常消失了。

当然,我还必须将我服务器上的所有 org.eclipse.persistence jar 文件替换为其 2.7.0 版本,并将javax.persistence.jar 替换为其 2.2.0 版本(我使用 payara,所以这些位于在&lt;payara_home&gt;\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 实体生成器

JPA - EclipseLink - 如何更改默认模式

从日期开始的日期 EXTRACT(DAY,s.date) 不起作用 jpa 和 eclipseLink

JPA/EclipseLink - 计算列

JPA2 (EclipseLink) 和 PostgreSQL 的引用问题