在 OSGI (Karaf) 中使用 EclipseLink JPA
Posted
技术标签:
【中文标题】在 OSGI (Karaf) 中使用 EclipseLink JPA【英文标题】:Using EclipseLink JPA in OSGI (Karaf) 【发布时间】:2015-07-08 05:23:04 【问题描述】:我使用 EclipseLink 作为我的 JPA 实现(在 KARAF 中)。并且使用了以下 jar:-
install -s mvn:org.eclipse.persistence/org.eclipse.persistence.antlr/2.5.0
install -s mvn:org.eclipse.persistence/org.eclipse.persistence.asm/2.5.0
install -s mvn:org.eclipse.persistence/org.eclipse.persistence.core/2.5.0
install -s mvn:org.apache.geronimo.specs/geronimo-jpa_2.0_spec/1.1
install -s mvn:org.osgi/org.osgi.compendium/4.2.0
install -s mvn:org.osgi/org.osgi.enterprise/4.2.0
org.eclipse.gemini.dbaccess.derby_1.0.0.M1-incubation.jar
org.eclipse.gemini.jpa.weaving_1.0.0.RC1.jar
org.eclipse.gemini.jpa_1.0.0.RC1.jar
我的persistence.xml
是:-
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="resource" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>myPkg.entity.Resource</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"
/> <property name="javax.persistence.jdbc.url" value="jdbc:derby:DB;create=true"
/>
<!-- <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver" />
<property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/D:\DB;create=true" /> -->
<property name="javax.persistence.jdbc.user" value="test" />
<property name="javax.persistence.jdbc.password" value="test" />
<property name="eclipselink.logging.level" value="OFF" />
<!-- EclipseLink should create the database schema automatically -->
<property name="eclipselink.ddl-generation" value="create-tables" />
<property name="eclipselink.ddl-generation.output-mode"
value="database" />
<property name="connection.autocommit" value="false" />
<property name="eclipselink.persistence-context.flush-mode" value="commit" />
<!-- <property name="eclipselink.allow-zero-id" value="true"/> -->
</properties>
</persistence-unit>
</persistence>
但gemini.dbaccess.derby_1.0.0.M1-incubation
jar remians 处于已安装状态以及 gemini.jpa.weaving jar
仍处于已解决状态。
重新启动gemini.dbaccess.derby_1.0.0.M1-incubation
会出现以下错误:-
Reason: Missing Constraint: Import-Package: org.apache.derby.client.am; version="0.0.0"
我的应用程序给出了以下错误:-
Could not find data source factory in registry: org.apache.derby.jdbc.ClientDriver
我是在 OSGI 中使用 eclipseLink 的新手,我在这里缺少什么?
【问题讨论】:
【参考方案1】:这里是org.eclipse.gemini.dbaccess.derby_1.0.0.M1-incubation.jar的manifest的内容:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Gemini DBAccess (Incubation)
Bundle-SymbolicName: org.eclipse.gemini.dbaccess.derby
Bundle-Version: 1.0.0.M1-incubation
Bundle-Activator: org.eclipse.gemini.dbaccess.derby.Activator
Bundle-Vendor: Oracle Corporation
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Import-Package: javax.sql,
org.apache.derby.client.am,
org.apache.derby.jdbc,
org.osgi.framework;version="[1.3,2)",
org.osgi.service.jdbc;version="[1.0,2.0)"
Derby 二进制文件仍有两个未解决的依赖项:
org.apache.derby.client.am org.apache.derby.jdbc两者都缺少版本号,这就是消息指出 0.0.0 的原因。
这两个包是 derbyclient.jar 文件的一部分,可作为 Derby 二进制文件中的 OSGi 包使用。问题是这个包的 Export-Package 子句只暴露了 org.apache.derby.jdbc 包。
一个简单的解决方案是SpringSource-packaged bundle:它公开了两个必需的包。注意,它对Java transaction API 有额外的依赖。
【讨论】:
那我该怎么办..?我的应用程序没有运行 下载 derby 存档并在您的容器中部署 derbyclient.jar 文件。它将 JDBC 组件作为导出包提供(JAR MANIFEST.MF 中的Export-Package 子句)。这应该可以解决您的错误。然后,您可能会遇到 org.apache.derby.client.am 包的依赖问题,因为它在类路径中可用,但未在 Export-Package 子句中公开。在这种情况下,您可能必须重新打包捆绑包,但这是another story。 SpringSource-packaged bundle 可以使用了:它公开了两个必需的包。【参考方案2】:首先,确保您已安装了使用 Karaf 的区域功能,因为如果您使用的版本小于 4(尚未发布),则默认安装 Apache Aries Blueprint 实现。所以如果你想坚持双子座,这会干扰。因此,请确保您已安装区域。其次,我认为有一个用于安装 eclipse-link 捆绑包的功能。可能想看看它以对齐正确的捆绑包。
如果您坚持使用 Aries Blueprint impl,那就更简单了。只需安装以下功能:
feature:install jpa jta jndi
如果您想使用 Derby,可能还需要安装 jdbc 功能。这将为您提供一系列用于连接数据库和/或创建数据源的命令。如果您使用数据源命令,您可以为 derby 数据库创建一个数据源,该数据库将在需要时安装正确的工作 derby 客户端 jar。
【讨论】:
【参考方案3】:Apache karaf 4.0.0 已经发布,该版本的karaf 提供了eclipseLink 支持。
feature:install eclipselink
因此使用eclipseLink不需要使用外部适配器
【讨论】:
哪个仓库有 eclipseLink 功能? feature:install 命令区分大小写 - feature:install eclipselink以上是关于在 OSGI (Karaf) 中使用 EclipseLink JPA的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 maven 项目轻松部署到 Karaf Osgi 容器
无法从 Karaf 2.2.0 OSGi 容器中的根上下文运行 WAR
OSGi:无法在 Apache Karaf 中找到 UserAdmin
您可以在不使用 JTA 的情况下在 OSGi 环境(如 Karaf)中使用 Hibernate 5.2 StatelessSession 吗?