Apache Aries JPA 与 Eclipselink:java.lang.LinkageError

Apache Aries JPA with Eclipselink: java.lang.LinkageError

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

当我启动此配置时,出现以下异常:

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 class?我希望这是 JDK.

的一部分

有谁知道这是什么原因造成的,或者我该如何解决这个问题?如何在 DS 环境中获取 Apache Aries JPA 运行 Eclipselink?

谢谢。

你看过OSGi enRoute project中的examples/tutorials了吗?这些将引导您完成将 JPA 与 OSGi 一起使用的过程。

从您提供的信息中无法清楚地看出您是如何尝试使用 Aries JPA 的,也不清楚您正在尝试使用哪些版本的库。 Java 的版本也会产生影响(Java 9 和 10 从 JRE 类路径中删除了一些条目)。取决于你在做什么,你可能安装了太多的包,而且它们几乎肯定在错误的地方。

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

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

  • javax.persistence - 这是 "official" JPA API,缺少建议您使用的 the JavaJPA contract
  • bundle,其中包含 jdbc.mssql 的 DataSourceFactory - 不清楚这是从哪里来的,但只要你需要就应该没问题
  • org.apache.aries.jpa.api - Aries JPA 容器不需要,仅当您使用 Aries JPA 事务回调时才需要。如果您确实需要交易,那么 OSGi Transaction Control Service (provided by 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 事务时才需要。如果是,那么您将需要更多的包和 lot 的 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 查询支持