在 OSGI (Karaf) 中使用 EclipseLink JPA

Using EclipseLink JPA in OSGI (Karaf)

我正在使用 EclipseLink 作为我的 JPA 实现(在 KARAF 中)。并且使用了以下 jars:-

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 处于 Installed 状态以及 gemini.jpa.weaving jar 仍然处于 resolved 状态。

重新启动 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,我在这里缺少什么?

这里是org.eclipse.gemini.dbaccess.derby_1.0.0.M1-incubation.jar的清单内容:

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: it exposes the two required packages. Beware, it has an additional dependency on the Java transaction API

首先,请确保您已随 Karaf 安装了区域功能,因为如果您使用的版本 < 4(尚未发布),则默认安装 Apache Aries Blueprint 实现。所以如果你想坚持双子座,这会有所干扰。因此,请确保您已安装 Regions。其次,我认为安装 eclipse-link 包有一个特点。可能想看一下它以对齐正确的捆绑包。

如果您坚持使用 Aries Blueprint impl,那么它会更简单。只需安装以下功能:

feature:install jpa jta jndi 

如果您想使用 Derby,可能还想安装 jdbc 功能部件。这将为您提供一系列命令,用于连接到数据库 and/or 创建数据源。如果您使用数据源命令,您可以为 derby 数据库创建一个数据源,如果需要,它将安装正确的工作 derby 客户端 jar。

Apache karaf 4.0.0已经发布,该版本karaf提供eclipseLink支持。

feature:install eclipselink

因此使用 eclipseLink 无需使用外部适配器