eclipseLink 2.7.0: Статическая ошибка переплетения для информации о подписывающей стороне "javax.persistence.AttributeConverter" не совпадает
При запуске задачи gradle для статического плетения в eclipseLink 2.7.0 появляется ошибка ниже.
21:50:14.206 [ОШИБКА] [system.err] Исключение Описание: Ошибка предварительной установки PersistenceUnit [по умолчанию].
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 [ОШИБКА] [system.err] Исключение Описание: Ошибка предварительной установки PersistenceUnit [по умолчанию].
21:50:14.206 [ОШИБКА] [system.err] Внутреннее исключение: java.lang.SecurityException: информация о подписчике класса "javax.persistence.AttributeConverter" не совпадает с информацией о подписывающей стороне других классов в том же пакете
Я осознаю, что эти конфликты возникают, когда на класс ссылаются разные банки.
Проверяется в тех же строках. Атрибут Convertter присутствует в javax.persistence 2.2.0, а также в eclipselink 2.7.0, вызывающем конфликт.
javax.persistence 2.2.0 является обязательной зависимостью для eclipselink 2.7.0.
Я gussesing должен исключить один из jar, чтобы AttributeConverter можно было ссылаться из 1 jar. Но не уверен, как.
Есть мысли по решению этой проблемы?
3 ответа
Проблема, кажется, с подписанием банок.
eclipselink 2.7.0 использует постоянство javax 2.2.0, которое подписано фондом eclipse, а eclipselink 2.7.0 - нет.
AttributeConverter в моем случае упоминался, и было несоответствие подписи. Выпуск 525457 уже подан на eclipse.org
Использование javax.persistence 2.1 решило проблему.
В моем случае помогло исключение зависимости от 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>
Насколько я могу судить, javax.persistence является транзитивной зависимостью в eclipselink 2.7.0.
Это означает, что нет необходимости добавлять его как отдельную зависимость.
Что-то, что мне очень помогло, это зависимость от понимания с Gradle. Он отображает различные источники, из которых получена зависимость.
dependencyInsight --dependency javax.persistence
Если вы видите в dependencyInsight, что транзитивная зависимость извлекается, а вы не хотите (например, javax.persistence из другого источника), вы можете попытаться отключить транзитивные зависимости для этой конкретной зависимости или просто исключить ее.
У меня была похожая проблема некоторое время назад. Моим быстрым решением было отключить javax.persistence в пути сборки моего корневого проекта. Вообще говоря, если у вас есть только один проект, вы можете попробовать изменить порядок, в котором используются зависимости. Вы можете найти эту настройку в вашем Java Build Path на вкладке "Порядок и экспорт" вашего проекта. (Я просто предполагаю, что вы используете Eclipse в качестве IDE)
Попробуйте переместить javax.persistence вниз в списке или снимите его.
Лично у меня только две зависимости gradle для jpa.
org.eclipse.persistence:org.eclipse.persistence.jpa
org.eclipse.persistence:eclipselink
Я отключил транзитивные зависимости на зависимости eclipselink.