在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。但不确定如何。
有关解决此问题的任何想法?
答案 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依赖的传递依赖。