Я пытался использовать JPA в OSGi и столкнулся с этим исключением:
javax.persistence.PersistenceException: No Persistence provider for EntityManager named test
Есть простая сущность класс, файл "persistence.xml" в META-INF:
<?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>
Активатор:
package org.test;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
public class Activator implements BundleActivator {
private static BundleContext context;
static BundleContext getContext() {
return context;
}
public void start(BundleContext bundleContext) throws Exception {
Activator.context = bundleContext;
EntityManagerFactory emf = Persistence.createEntityManagerFactory("test");
}
public void stop(BundleContext bundleContext) throws Exception {
Activator.context = null;
}
}
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: Исключение в org .test.Activator.start () пакета org.test. в
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) в орг. eclipse.osgi.framework.internal.core.Framework.resumeBundle (Framework.java:1131) в org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles (StartLevelManager.java : 559) в org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles (StartLevelManager.java:544) в org.eclipse .osgi.framework.internal.core.StartLevelManager.incFWSL (StartLevelManager.java:457) в org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevelager (StartLevel :Manager 243) в org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent (StartLevelManager.java:438) в org.eclipse. osgi.framework.internal.core.StartLevelManager.dispatchEvent (StartLevelManager.java:1) в org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent (EventManager.java:230) { {1}} в o rg.eclipse.osgi.framework.eventmgr.EventManager $ EventThread.run (EventManager.java:340) Вызвано: javax.persistence.PersistenceException: No Persistence поставщиком для EntityManager с именем test в { {1}} javax.persistence.Persistence.createEntityManagerFactory (неизвестный источник) в javax.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: нет поставщика сохраняемости для EntityManager с именем test в javax.persistence.Persistence.createEntityManagerFactory (неизвестный источник ) в javax.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.Fra mework.resumeBundle (Framework.java:1131) в org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles (StartLevelManager.java:559) в { {1}} org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles (StartLevelManager.java:544) в org.eclipse.osgi.framework.internal.core.StartLevelManager .incFWSL (StartLevelManager.java:457) в org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel (StartLevelManager.java:243) в {{ 1}} org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent (StartLevelManager.java:438) в org.eclipse.osgi.framework.internal.core.StartLevelManager. dispatchEvent (StartLevelManager.java:1) в орг.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent (EventManager.java:230) в org.eclipse.osgi.framework.eventmgr.EventManager $ EventThread.run (EventManager.java:340 )
persistence.xml работает правильно в простом java-проекте, но в подключаемом модуле OSGi у меня возникает эта проблема. Что не так?