3

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

21:50:14.206 [ERROR] [system.err] 异常描述:PersistenceUnit [default] 的预部署失败。
21:50:14.206 [错误] [system.err] 内部异常:java.lang.SecurityException:类“javax.persistence.AttributeConverter”的签名者信息与同一包中其他类的签名者信息不匹配
21:50 :14.206 [错误] [system.err] 在 org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.createPredeployFailedPersistenceException(EntityManagerSetupImpl.java:20 80)
21:50:14.206 [错误] [system.err] 在 org.eclipse。 persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:2071)
21:50:14.206 [ERROR] [system.err] 异常描述:PersistenceUnit [default] 的预部署失败。
21:50:14.206 [错误] [system.err] 内部异常:java.lang.SecurityException:类“javax.persistence.AttributeConverter”的签名者信息与同一包中其他类的签名者信息不匹配

我知道这些冲突是在不同的 jar 引用类时发生的。
检查相同的行。 javax.persistence 2.2.0 和 eclipselink 2.7.0 中存在导致冲突的 AttributeConverter。javax.persistence 2.2.0 是 eclipselink 2.7.0 的必需依赖项。
我猜测必须排除其中一个罐子,以便可以从 1 个罐子中引用 AttributeConverter。但不确定如何。

关于解决这个问题的任何想法?

4

3 回答 3

4

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

    <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>
于 2017-11-17T12:44:24.710 回答
1

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

于 2017-10-30T09:52:12.690 回答
0

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

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

对我有很大帮助的是来自 gradle 的dependencyInsight。它显示了依赖项的不同来源。

dependencyInsight --dependency javax.persistence

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

不久前我有一个类似的问题。我的快速修复是取消选中我的根项目的构建路径中的 javax.persistence。一般来说,如果你只有一个项目,可以尝试切换依赖的使用顺序。您可以在项目的“订购和导出”选项卡中的 Java 构建路径中找到该设置。(我只是假设您使用 Eclipse 作为 IDE)

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

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

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

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

于 2017-09-29T09:22:12.610 回答