47

运行由 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 版本可以解决问题(这个没有签名),但我不确定这是不是正常情况。

4

10 回答 10

38

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

<!-- See https://stackoverflow.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没有签名问题的早期版本。

旁白:在原始问题中显示的 pom 片段中,javax.persistenceversion被显式拉入,尽管它已经是.2.2.0eclipselink

解释

摘要 -eclipselink工件取决于javax.persistence并且都包含包中的类javax.persistence。但是,javax.persistence罐子已签名,而罐子未签名eclipselinkjavax.persistence因此,当从 jar 中的包中加载类时,Java 运行时会抱怨它缺少签名与已经从jareclipselink中的同一包中加载的类不匹配。javax.persistence

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 Foundation 签名并包含包中的类javax.persistence。当我的应用程序的某些部分(实际上是 Spring 逻辑中的某些内容)尝试加载javax.persistence.EntityManagerFactory.

java.lang.ClassLoader.checkCerts(String, CodeSource)如果我然后在该throw new SecurityException行上放置一个断点,那么当传入的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。即它与其他一些依赖项没有冲突:

[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 上记录了这个 - 参见 bug 525457

于 2017-10-02T13:14:32.650 回答
20

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

<dependency>
    <groupId>org.eclipse.persistence</groupId>
    <artifactId>org.eclipse.persistence.jpa</artifactId>
    <version>2.7.1</version>
</dependency>
于 2018-06-18T06:20:34.940 回答
3

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

于 2018-07-16T08:46:01.277 回答
3

这种奇怪的情况似乎仍然存在,在我的情况下没有使用 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)。

奇怪的情况。

于 2019-03-04T16:13:18.027 回答
2

我的项目正在使用 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'
于 2019-05-10T20:06:34.670 回答
1

Obinna 的回答是正确的;我猜 eclipselink 2.7.x 存在问题——正如 George 指出的那样。升级 eclipselink 时我遇到了类似的问题,但这只是错误的人工制品。最初描述的问题似乎是外部引用 javax.persistence 级别的结果 - 这绝对没有必要。

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

于 2018-07-27T09:55:36.040 回答
1

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

于 2018-06-23T18:56:16.937 回答
0

我在我的项目构建中使用 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'
}

我认为最后一个是最好的解决方案。

于 2019-03-21T07:39:01.353 回答
0

因为仅使用 Tomcat 时我无法找到此问题的答案,并且此线程通常与此问题相关联,所以我将在此处发布我的解决方案:

由于签名在 MANIFEST.MF 中,您可以使用 7zip 或 WinRAR 更改 .jar 文件中的签名以打开它们,或者直接从两个 .jar 的 META-INF 文件中删除它们,然后将更改的文件导入您的 IDE。

Signature-Mismatch-Problem 的一个有用线程是这个线程:Java SecurityException: signer information does not match

于 2019-07-04T11:16:48.660 回答
0

我也遇到了这个问题,我的情况有点不同,因为我没有使用 Maven。但是,我在这里给出一个答案,因为它可能会让人们了解如何在自己的情况下处理这个问题。毕竟,标题是关于这种不匹配的,一般来说,一个子案例是使用 Maven 时。

我在 NetBeans 项目中使用 eclipselink。最初,我将 eclipselink jar 文件 ( eclipselink-2.7.0.jar) 和所需的 org.eclipse.persistence jar 文件作为外部库放置到我的项目中。上面Sergeyentreprenr的评论实际上是引导我解决问题的原因。我要做的是创建一个新库(Tools->Libraries->New Library...),它包含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 版本,并将 jar 文件替换为javax.persistence.jar2.2.0 版本(我使用 payara,所以这些文件位于 下<payara_home>\glassfish\modules)。

于 2018-12-06T17:20:25.987 回答