OSGi+;JPA(postgresql)

OSGi+;JPA(postgresql),postgresql,jpa,osgi,eclipselink,Postgresql,Jpa,Osgi,Eclipselink,我试图在OSGi中使用JPA,但遇到了以下例外: javax.persistence.PersistenceException: No Persistence provider for EntityManager named test META-INF中有简单的实体类文件“persistence.xml”: <?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" xmlns="http://jav

我试图在OSGi中使用JPA,但遇到了以下例外:

 javax.persistence.PersistenceException: No Persistence provider for EntityManager named test 
META-INF中有简单的实体类文件“persistence.xml”:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.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_2_0.xsd">
  <persistence-unit name="test" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>org.test.Room</class>
    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/test"/>
      <property name="javax.persistence.jdbc.password" value="12345"/>
      <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
      <property name="javax.persistence.jdbc.user" value="postgres"/>

    </properties>
  </persistence-unit>
</persistence>
Manifest.mf:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Test
Bundle-SymbolicName: org.test
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: org.test.Activator
Import-Package: javax.persistence;version="2.0.3", 
 org.osgi.framework;version="1.3.0",
 org.postgresql;version="8.3.604"
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
和错误:

org.osgi.framework.BundleException:中的异常 bundle org.test的org.test.Activator.start()。在

org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:734)

在 org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:683) 在 org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:381) 在 org.eclipse.osgi.framework.internal.core.AbstractBundle.resume(AbstractBundle.java:389) 在 org.eclipse.osgi.framework.internal.core.framework.resumeBundle(framework.java:1131) 在 org.eclipse.osgi.framework.internal.core.startevelmanager.resumeBundles(startevelmanager.java:559) 在 org.eclipse.osgi.framework.internal.core.startevelmanager.resumeBundles(startevelmanager.java:544) 在 org.eclipse.osgi.framework.internal.core.startevelmanager.incFWSL(startevelmanager.java:457) 在 org.eclipse.osgi.framework.internal.core.startevelmanager.dosetstartevel(startevelmanager.java:243) 在 org.eclipse.osgi.framework.internal.core.startEvelManager.dispatchEvent(startEvelManager.java:438) 在 org.eclipse.osgi.framework.internal.core.startEvelManager.dispatchEvent(startEvelManager.java:1) 在 org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) 在 org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:340) 原因:javax.persistence.PersistenceException:无持久性 名为测试的EntityManager的提供程序位于 persistence.persistence.createEntityManagerFactory(未知 来源)在 persistence.persistence.createEntityManagerFactory(未知 org.test.Activator.start(Activator.java:23)的 org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run(BundleContextImpl.java:711) 位于java.security.AccessController.doPrivileged(本机方法) org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:702) ... 12更多根异常: javax.persistence.PersistenceException:没有名为test的EntityManager的持久性提供程序 persistence.persistence.createEntityManagerFactory(未知 来源)在 persistence.persistence.createEntityManagerFactory(未知 org.test.Activator.start(Activator.java:23)的 org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run(BundleContextImpl.java:711) 位于java.security.AccessController.doPrivileged(本机方法) org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:702) 在 org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:683) 在 org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:381) 在 org.eclipse.osgi.framework.internal.core.AbstractBundle.resume(AbstractBundle.java:389) 在 org.eclipse.osgi.framework.internal.core.framework.resumeBundle(framework.java:1131) 在 org.eclipse.osgi.framework.internal.core.startevelmanager.resumeBundles(startevelmanager.java:559) 在 org.eclipse.osgi.framework.internal.core.startevelmanager.resumeBundles(startevelmanager.java:544) 在 org.eclipse.osgi.framework.internal.core.startevelmanager.incFWSL(startevelmanager.java:457) 在 org.eclipse.osgi.framework.internal.core.startevelmanager.dosetstartevel(startevelmanager.java:243) 在 org.eclipse.osgi.framework.internal.core.startEvelManager.dispatchEvent(startEvelManager.java:438) 在 org.eclipse.osgi.framework.internal.core.startEvelManager.dispatchEvent(startEvelManager.java:1) 在 org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) 在 org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:340)


xml在一个简单的java项目中正常工作,但在OSGi插件中我遇到了这个问题。怎么了?

您需要将persistence.xml路径添加为MANIFEST.MF头,如下所示:

Meta-Persistence: META-INF/persistence.xml
尽管对于EclipseLink,可能需要以下标题(标题值是以逗号分隔的PU名称列表):


在您的清单中看不到您在
persistence.xml
Try
DynamicImport-Package:org.eclipse.*.
中提到的持久性提供程序类的导入谢谢您的回答,但我仍然有这个错误good stuff=)OSGi是非常详细的,企业规范中有很多关于JPA的信息,您可能会发现这些信息非常有用
Meta-Persistence: META-INF/persistence.xml
JPA-PersistenceUnits: test