Apache Aries JPA with Eclipselink: java.lang.LinkageError



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

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

谢谢。

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

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

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

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

  • javax.persistence- 这是"官方"JPA API,缺少建议您使用的JavaJPA合约。
  • 包含 jdbc.mssql 数据源工厂的捆绑包- 不清楚这是从哪里来的,但只要你需要,它应该没问题
  • 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 事务时才需要。如果是,那么您将需要更多的捆绑包和大量的数据源配置。同样,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 或更低版本,那么此捆绑包需要位于类路径上并通过系统捆绑包公开。如果您使用的是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- This is Eclipselink
  • org.eclipse.persistence.jpa- 在 Eclipselink ORM 之上提供 JPA 实现
  • org.eclipse.persistence.jpa.jpql- 这提供了JPQL查询支持

相关内容

最新更新