eclipseLink 2.7.0:"javax.persistence.AttributeConverter" 的签名者信息不匹配的静态编织错误

eclipseLink 2.7.0: Static weaving error for "javax.persistence.AttributeConverter"'s signer information does not match

关于 运行 gradle eclipseLink 2.7.0 中的静态编织任务出现以下错误。

21:50:14.206 [ERROR] [system.err] Exception Description: Predeployment of PersistenceUnit [default] failed.
21:50:14.206 [ERROR] [system.err] Internal Exception: java.lang.SecurityException: class "javax.persistence.AttributeConverter"'s signer information does not match signer info rmation of other classes in the same package
21:50:14.206 [ERROR] [system.err] at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.createPredeployFailedPersistenceException(EntityManagerSetupImpl.java:20 80)
21:50:14.206 [ERROR] [system.err] at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:2071)
21:50:14.206 [ERROR] [system.err] Exception Description: Predeployment of PersistenceUnit [default] failed.
21:50:14.206 [ERROR] [system.err] Internal Exception: java.lang.SecurityException: class "javax.persistence.AttributeConverter"'s signer information does not match signer info rmation of other classes in the same package

我知道当 class 被不同的 jar 引用时会发生这些冲突。
检查相同的 lines.AttributeConverter 出现在 javax.persistence 2.2.0 中以及导致冲突的 eclipselink 2.7.0。 javax.persistence 2.2.0 是 eclipselink 2.7.0 的必需依赖项。
我在猜测必须排除其中一个 jar,以便可以从 1 jar.But 中引用 AttributeConverter 不知道如何。

对解决这个问题有什么想法吗?

据我所知,javax.persistence 是 eclipselink 2.7.0 中的传递依赖。

这意味着不需要将其添加为单独的依赖项。

gradle 的 dependencyInsight 对我帮助很大。它显示从中提取依赖项的不同来源。

dependencyInsight --dependency javax.persistence

如果您在 dependencyInsight 中看到,您不希望拉取传递依赖项(例如 javax.persistence 来自另一个来源),您可以尝试禁用该特定依赖项的传递依赖项或只是排除它。

我刚才遇到过类似的问题。我的快速修复是在根项目的构建路径中取消选中 javax.persistence。 一般来说,如果你只有一个项目,可以试试调换依赖的使用顺序。 您可以在项目的选项卡 "Order and Export" 中的 Java 构建路径中找到该设置。 (我只是假设您将 Eclipse 用作 IDE)

尝试在列表中向下移动 javax.persistence 或取消选中它。

就个人而言,我只有两个 gradle jpa 依赖项。

org.eclipse.persistence:org.eclipse.persistence.jpa
org.eclipse.persistence:eclipselink

我禁用了对 eclipselink 依赖项的传递依赖项。

问题似乎与罐子的签名有关。 eclipselink 2.7.0 使用由 eclipse 基金会签署的 javax persistence 2.2.0,而 eclipselink 2.7.0 则不是。 在我的案例中,AttributeConverter 被引用并且签名不匹配。 Issue 525457 已经提交给 eclipse.org
使用 javax.persistence 2.1 解决了问题。

就我而言,排除捆绑的 JPA API 依赖项并包括独立的 JPA 有帮助:

    <dependency>
        <groupId>org.eclipse.persistence</groupId>
        <artifactId>org.eclipse.persistence.jpa</artifactId>
        <version>2.7.0</version>
        <exclusions>
            <exclusion>
                <!-- The JPA API imported separately due to problems with JAR signature. -->
                <groupId>org.eclipse.persistence</groupId>
                <artifactId>javax.persistence</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>javax.persistence</groupId>
        <artifactId>javax.persistence-api</artifactId>
        <version>2.2</version>
    </dependency>