【问题标题】:Apache Aries JPA with Eclipselink: java.lang.LinkageError带有 Eclipselink 的 Apache Aries JPA:java.lang.LinkageError
【发布时间】:2018-12-05 04:15:36
【问题描述】:

我正在尝试将 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 一起运行?

谢谢。

【问题讨论】:

    标签: java jpa osgi eclipselink aries


    【解决方案1】:

    您看过OSGi enRoute project 中的示例/教程吗?这些将引导您完成将 JPA 与 OSGi 结合使用的过程。

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

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

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

    • javax.persistence - 这是“官方”JPA API,缺少推荐使用的the JavaJPA contract。
    • 包含 jdbc.mssql 的 DataSourceFactory 的包 - 不清楚它的来源,但只要你需要它应该没问题
    • 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 服务的参考实现
    • 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 - 如果您删除了其他一些 Aries 捆绑包,则不需要这样做
    • org.apache.geronimo.specs.geronimo-jta_1.1_spec - 这个很乱。 JTA 接口包被拆分,只有一部分在 JRE 中。如果您使用的是 Java 8 或更低版本,则此捆绑包 needs to be on the classpath and exposed through the system bundle。如果您使用的是 Java 9+,则该包已从 JRE 中删除,您可以将包放入您的框架中
    • org.apache.aries.jpa.eclipselink.adapter - 需要代表 EclipseLink 注册 PersistenceProvider 服务
    • org.eclipse.persistence.antlr - Eclipselink 需要
    • org.eclipse.persistence.asm - Eclipselink 需要
    • org.eclipse.persistence.core - 这是 Eclipselink
    • org.eclipse.persistence.jpa - 在 Eclipselink ORM 之上提供 JPA 实现
    • org.eclipse.persistence.jpa.jpql - 这提供了 JPQL 查询支持

    【讨论】:

    • 谢谢,Tim,缺少的部分暴露了geronimo 包。另一个问题:为什么您更喜欢 Tx Control 而不是使用 Apache Aires JpaTemplate?
    • 有很多原因,但主要是因为它更容易和更可靠地工作。多年来,我见过很多配置错误的 XADataSource,它们实际上并没有参与事务并导致可怕的数据损坏。 JpaTemplate 也不如事务控制服务灵活,后者允许您控制各种异常类型的回滚行为。事务控制还允许您暂停/嵌套事务。另一个很好的理由是事务控制是一种 OSGi 标准,支持其他资源类型。
    猜你喜欢
    • 2020-02-18
    • 2012-02-28
    • 2015-04-12
    • 2014-09-16
    • 1970-01-01
    • 2016-08-30
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多