Apache Aries JPA с Eclipselink: java.lang.LinkageError - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь использовать Apache Aries JPA в сочетании с Eclipselink (и базой данных MSSQL). Мой OSGi-фреймворк - Apache Felix, и я использую DS (используя BndTools). После долгих проб и ошибок я нашел необходимые комплекты:

  • javax.persistence
  • комплект, содержащий DataSourceFactory для jdbc.mssql
  • org.apache.aries.jpa.api
  • org.apache.aries.jpa.container
  • org.apache.aries.jpa.support
  • org.apache.aries.transaction.manager
  • org.apache.aries.jpa.javax.persistence_2.0
  • org.apache.aries.util
  • org.apache.geronimo.specs.geronimo-jta_1.1_spec
  • org.apache.aries.jpa.eclipselink.adapter
  • org.eclipse.persistence.antlr
  • org.eclipse.persistence.asm
  • org.eclipse.persistence.core
  • org.eclipse.persistence.jpa
  • org.eclipse.persistence.jpa.jpql

Когда я запускаю эту конфигурацию, я получаю следующее исключение:

java.lang.NoClassDefFoundError: javax/sql/DataSource
at org.eclipse.persistence.jpa.PersistenceProvider.createContainerEntityManagerFactoryImpl(PersistenceProvider.java:328)
at org.eclipse.persistence.jpa.PersistenceProvider.createContainerEntityManagerFactory(PersistenceProvider.java:313)

Какой пакет должен содержать класс javax.sql.DataSource? Я ожидал, что это будет частью JDK.

У кого-нибудь есть идея, чем это вызвано или как я могу это исправить? Как я могу запустить Apache Aries JPA с Eclipselink в среде DS?

Спасибо.

1 Ответ

0 голосов
/ 27 июня 2018

Вы смотрели примеры / учебные пособия в проекте OSGi enRoute ? Они проведут вас через процесс использования JPA с OSGi.

Из предоставленной вами информации неясно, как вы пытаетесь использовать Aries JPA, а также какие версии библиотек вы пытаетесь использовать. Версия Java также может оказать влияние (Java 9 и 10 удалили некоторые записи из пути к классам JRE). В зависимости от того, что вы делаете, вы, вероятно, установили слишком много пакетов, и они почти наверняка находятся в неправильном месте.

Просто предположите (основываясь на вашем утверждении, что у вас есть пакет, который предоставляет службу DataSourceFactory, не говоря, что это за пакет), у вас есть упакованный драйвер JDBC? Была ли эта упаковка сделана правильно? Если нет, то это может быть источником вашего NoClassDefFoundError.

Что касается пакетов, это был вывод операции разрешения? Похоже, что это было собрано вручную ...

  • javax.persistence - это «официальный» API JPA, в котором отсутствует контракт JavaJPA , который рекомендуется использовать.
  • комплект, который содержит DataSourceFactory для jdbc.mssql - Непонятно, откуда это берется, но все должно быть хорошо, если вам нужно
  • org.apache.aries.jpa.api - Не требуется для контейнера Aries JPA, требуется только при использовании обратных вызовов транзакции Aries JPA. Если вам нужны транзакции, тогда OSGi Transaction Control Service (предоставляется Apache Aries Tx Control )
  • org.apache.aries.jpa.container - Это контейнер JPA, и он вам определенно нужен. В идеале вы будете использовать Aries JPA 2.7.0, который является эталонной реализацией OSGi R7 JPA Service
  • org.apache.aries.jpa.support - В зависимости от того, как вы пишете код, это может вам понадобиться или не понадобиться. Это реализация пакета API, который обеспечивает обратные вызовы транзакций. Контроль транзакций лучше во всех отношениях.
  • org.apache.aries.transaction.manager - Требуется только в том случае, если вы пытаетесь использовать транзакции XA. Если это так, вам понадобится больше пакетов и лот конфигурации DataSource. Опять же, Aries Transaction Control сделает это намного проще, и это описано в руководстве enRoute.
  • org.apache.aries.jpa.javax.persistence_2.0 - Если вы не используете очень старый EclipseLink, это очень устарело. EclipseLink некоторое время был JPA 2.1, а сейчас - JPA 2.2
  • org.apache.aries.util - Это не понадобится, если вы удалите некоторые другие комплекты Овна
  • org.apache.geronimo.specs.geronimo-jta_1.1_spec - Это беспорядок. Интерфейсный пакет JTA разделен, и только его часть находится в JRE. Если вы используете Java 8 или ниже, этот пакет должен находиться в пути к классам и быть доступным через системный пакет . Если вы работаете на Java 9+, пакет был удален из JRE, и вы можете просто поместить пакет в ваш фреймворк
  • org.apache.aries.jpa.eclipselink.adapter - необходим для регистрации службы PersistenceProvider от имени EclipseLink
  • org.eclipse.persistence.antlr - Требуется Eclipselink
  • org.eclipse.persistence.asm - Требуется Eclipselink
  • org.eclipse.persistence.core - Это Eclipselink
  • org.eclipse.persistence.jpa - Предоставляет реализацию JPA поверх Eclipselink ORM
  • org.eclipse.persistence.jpa.jpql - обеспечивает поддержку запросов JPQL
...