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

时间:2017-09-28 16:49:55

标签: java eclipselink javax.persistence

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

  

21:50:14.206 [错误] [system.err]异常说明:PersistenceUnit的预部署[默认]失败。
  21:50:14.206 [错误] [system.err]内部异常:java.lang.SecurityException:class" javax.persistence.AttributeConverter""的签名者信息与签名者信息不匹配   同一包中其他类的形式
  21:50:14.206 [错误] [system.err] at or.e.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.createPredeployFailedPersistenceException(EntityManagerSetupImpl.java:20   80)
  21:50:14.206 [错误] [system.err] at or.e.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:2071)
  21:50:14.206 [错误] [system.err]异常说明:PersistenceUnit的预部署[默认]失败。
  21:50:14.206 [错误] [system.err]内部例外:   java.lang.SecurityException:class" javax.persistence.AttributeConverter""的签名者信息与签名者信息不匹配   同一个包中其他类的例子

我知道当类被不同的jar引用时会出现这些冲突。
检查相同的行.AttributeConverter出现在javax.persistence 2.2.0以及eclipselink 2.7.0中,导致冲突。 对于eclipselink 2.7.0,javax.persistence 2.2.0是必需的依赖项 我迷恋必须排除其中一个jar,以便可以从1个jar中引用AttributeConverter。但不确定如何。

有关解决此问题的任何想法?

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分:1)

问题似乎与签署罐子有关。 eclipselink 2.7.0使用了由eclipse基础签名的javax持久性2.2.0,其中eclipselink 2.7.0不是。 在我的案例中引用了AttributeConverter并且存在签名不匹配。 Issue 525457已经在eclipse.org上提交了 使用javax.persistence 2.1解决了这个问题。

答案 2 :(得分:0)

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

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

对我有很大帮助的是来自gradle的dependencyInsight。它显示了从中提取依赖关系的不同来源。

dependencyInsight --dependency javax.persistence

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

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

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

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

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

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