java - EclipseLink 2.7.0 和 JPA API 2.2.0 - 签名不匹配

标签 java jpa eclipselink jpa-2.2

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

最佳答案

感谢 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

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

说明

总结 - eclipselink 工件依赖于 javax.persistence 并且两者都包含包 javax.persistence 中的类。但是 javax.persistence jar 已签名,而 eclipselink 则未签名。因此,Java 运行时会提示,当从 eclipselink jar 中的包 javax.persistence 加载一个类时,它缺少签名与已经加载的类不匹配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 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 <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 .

关于java - EclipseLink 2.7.0 和 JPA API 2.2.0 - 签名不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45870753/

相关文章:

jpa - JPQL/JPA 查询基于两列的最大/最大值对实体进行排序?

java - 当主键自动递增时,如何使用 JPA (EclipseLink) 从数据库中获取特定的 "row"?

java - 如何通过不对数据库进行 N 次调用来获取实体集合中的惰性属性

java - Jetty EndPoint.flush(ByteBuffer b) 返回 false 时该怎么办?

java - AEM 搜索和推广搜索优化

java - Spring 应用程序正在从我的所有属性文件加载属性,而不仅仅是我在上下文 :property-placeholder 中指定的属性

java - 用于 HSQLDB 的 Hibernate @generatedvalue

java - 跟踪实体的状态变化

java - Liferay Portlet 基本 MVC 流程和 View 选择

java - @RequestParam 数组映射问题