0

我正在尝试将 Apache Aries JPA 与 Eclipselink(和一个 MSSQL 数据库)结合使用。我的 OSGi 框架是 Apache Felix,我正在使用 DS(通过使用 BndTools)。经过长时间的反复试验,我找到了必要的捆绑包:

  • javax.persistence
  • 包含 jdbc.mssql 的 DataSourceFactory 的包
  • 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 在 DS 环境中与 Eclipselink 一起运行?

谢谢。

4

1 回答 1

0

您是否查看过OSGi enRoute 项目中的示例/教程?这些将引导您完成将 JPA 与 OSGi 一起使用的过程。

从您提供的信息中不清楚您如何尝试使用 Aries JPA,也不清楚您尝试使用哪些版本的库。Java 的版本也会产生影响(Java 9 和 10 从 JRE 类路径中删除了一些条目)。根据您正在执行的操作,您可能安装了太多捆绑软件,而且几乎可以肯定它们安装在错误的位置。

只是猜测(根据您的声明,您有一个提供 DataSourceFactory 服务的包,而没有说明该包是什么)您有一个包装好的 JDBC 驱动程序?包装是否正确完成?如果不是,那么这很容易成为您的 NoClassDefFoundError 的来源。

至于捆绑包,这是解析操作的输出吗?看起来这可能是手动组装的......

  • javax.persistence - 这是“官方”JPA API,缺少推荐使用的 JavaJPA 契约。
  • 包含 jdbc.mssql 的 DataSourceFactory 的包- 不清楚这是从哪里来的,但只要你需要它就可以了
  • org.apache.aries.jpa.api - Aries JPA 容器不需要,仅当您使用 Aries JPA 事务回调时才需要。如果您确实需要事务,那么OSGi 事务控制服务(由Apache Aries Tx Control提供)
  • org.apache.aries.jpa.container - 这是 JPA 容器,您肯定需要它。理想情况下,您将使用 Aries JPA 2.7.0,它是 OSGi R7 JPA 服务的参考实现
  • org.apache.aries.jpa.support - 根据您编写代码的方式,您可能需要也可能不需要它。它是提供事务回调的 API 包的实现。事务控制几乎在各个方面都更好。
  • org.apache.aries.transaction.manager - 仅当您尝试使用 XA 事务时才需要。如果您是,那么您将需要更多的捆绑包和大量的 DataSource 配置。同样,Aries 事务控制将更简单地完成此操作,并在 enRoute 教程中进行了描述。
  • org.apache.aries.jpa.javax.persistence_2.0 - 除非您使用的是非常旧的 EclipseLink,否则它已经过时了。EclipseLink 是 JPA 2.1 有一段时间了,现在是 JPA 2.2
  • org.apache.aries.util - 如果您删除了一些其他 Aries 捆绑包,则不需要这样做
  • org.apache.geronimo.specs.geronimo-jta_1.1_spec - 这个很乱。JTA 接口包被拆分,只有一部分在 JRE 中。如果您使用的是 Java 8 或更低版本,则此捆绑包需要位于类路径中并通过系统捆绑包公开。如果您使用的是 Java 9+,则该包已从 JRE 中删除,您可以将包放入您的框架中
  • org.apache.aries.jpa.eclipselink.adapter - 需要代表 EclipseLink 注册 PersistenceProvider 服务
  • org.eclipse.persistence.antlr - Eclipse 需要链接
  • org.eclipse.persistence.asm - Eclipse 需要链接
  • org.eclipse.persistence.core - 这是 Eclipselink
  • org.eclipse.persistence.jpa - 在 Eclipselink ORM 之上提供 JPA 实现
  • org.eclipse.persistence.jpa.jpql - 这提供了 JPQL 查询支持
于 2018-06-27T08:44:33.420 回答