Получение java.lang.NoClassDefFoundError: ошибка javax/naming/NamingException при доступе к пакету OSGI с поддержкой JPA

Я использую OpenJPA в качестве провайдера JPA. Я создал небольшой пакетный проект OSGI с поддержкой JPA2.0. Этот пакет предоставляет своим клиентам функциональность сохранения.

Я создал еще один клиентский пакет для использования вышеуказанной службы постоянства. Когда я запускаю службу клиентских пакетов с помощью Felix framework, я получаю следующую ошибку:

java.lang.NoClassDefFoundError: javax/naming/NamingException

Полная трассировка стека

org.osgi.framework.BundleException: Activator start error in bundle StudentServiceConsumer [120].
        at org.apache.felix.framework.Felix.activateBundle(Felix.java:2027)
        at org.apache.felix.framework.Felix.startBundle(Felix.java:1895)
        at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:944)
        at org.apache.felix.gogo.command.Basic.start(Basic.java:729)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.apache.felix.gogo.runtime.Reflective.invoke(Reflective.java:137)
        at org.apache.felix.gogo.runtime.CommandProxy.execute(CommandProxy.java:82)
        at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:477)
        at org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:403)
        at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108)
        at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:183)
        at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:120)
        at org.apache.felix.gogo.runtime.CommandSessionImpl.execute(CommandSessionImpl.java:89)
        at org.apache.felix.gogo.shell.Console.run(Console.java:62)
        at org.apache.felix.gogo.shell.Shell.console(Shell.java:203)
        at org.apache.felix.gogo.shell.Shell.gosh(Shell.java:128)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.apache.felix.gogo.runtime.Reflective.invoke(Reflective.java:137)
        at org.apache.felix.gogo.runtime.CommandProxy.execute(CommandProxy.java:82)
        at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:477)
        at org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:403)
        at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108)
        at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:183)
        at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:120)
        at org.apache.felix.gogo.runtime.CommandSessionImpl.execute(CommandSessionImpl.java:89)
        at org.apache.felix.gogo.shell.Activator.run(Activator.java:75)
        at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NoClassDefFoundError: javax/naming/NamingException
        at com.student.serviceprovider.serviceimpl.StudentDAOService.persist(StudentDAOService.java:19)
        at com.student.serviceconsumer.activator.Activator.start(Activator.java:30)
        at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:645)
        at org.apache.felix.framework.Felix.activateBundle(Felix.java:1977)
        ... 32 more
Caused by: java.lang.ClassNotFoundException: javax.naming.NamingException not found by org.apache.openjpa [109]
        at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1460)
        at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:72)
        at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1843)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        ... 36 more
**java.lang.NoClassDefFoundError: javax/naming/NamingException**

В настоящее время нижеуказанные пакеты находятся в активном состоянии.

 ID|State      |Level|Name
   0|Active     |    0|System Bundle (4.0.3)
   1|Active     |    1|file:/C:/Felix/felix-framework-4.0.3/bundle/junit.jar (0.0.0)
   2|Active     |    1|Apache Felix Bundle Repository (1.6.6)
   3|Active     |    1|Apache Felix Gogo Command (0.12.0)
   4|Active     |    1|Apache Felix Gogo Runtime (0.10.0)
   5|Active     |    1|Apache Felix Gogo Shell (0.10.0)
   7|Active     |    1|WS_J2EE_persistence (7.0.0)
 105|Active     |    1|file:/C:/Felix/felix-framework-4.0.3/bundle/commons-logging-4.0.6.jar (0.0.0)
 106|Active     |    1|Apache Commons Lang (2.6.0.v201205030909)
 107|Active     |    1|Apache Commons Logging Plug-in (1.0.4.v201101211617)
 109|Active     |    1|OpenJPA Plug-in (1.2.1.201001181728)
 114|Active     |    1|file:/C:/Felix/felix-framework-4.0.3/bundle/rt.jar (0.0.0)
 119|Active     |    1|StudentServiceProvider (1.0.0.201303061113)

MENIFEST.MF (набор услуг)

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: StudentServiceProvider
Bundle-SymbolicName: StudentServiceProvider
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: com.student.serviceprovider.activator.Activator
Import-Package: org.osgi.framework
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Meta-Persistence: META-INF/persistence.xml
Export-Package: com.student.serviceprovider.model,
 com.student.serviceprovider.service,
 com.student.serviceprovider.serviceimpl
Bundle-ClassPath: ../lib/com.ibm.ws.jpa.jar,
 ../lib/commons-collections-20040616.jar,
 ../lib/j2ee.jar,
 ../lib/mysql-connector-java-5.1.7-bin.jar,
 .
Require-Bundle: org.apache.openjpa;bundle-version="1.2.1",
 org.apache.commons.logging;bundle-version="1.0.4"

MENIFEST.MF(Набор клиентов)

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: StudentServiceConsumer
Bundle-SymbolicName: StudentServiceConsumer
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: com.student.serviceconsumer.activator.Activator
Import-Package: com.student.serviceprovider.model,
 com.student.serviceprovider.service,
 com.student.serviceprovider.serviceimpl,
 org.osgi.framework
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Export-Package: com.student.serviceconsumer.activator

Я новичок в разработке пакетов OSGI. Пожалуйста, помогите мне решить эту проблему.


person Java-Seekar    schedule 06.03.2013    source источник
comment
Используете ли вы поставщика услуг JPA, подобного тому, который предоставляется Apache Aries? Вы по-прежнему можете использовать OpenJPA, но использовать его отдельно в среде OSGi обычно не так хорошо.   -  person Holly Cummins    schedule 08.03.2013


Ответы (3)


Ваш клиентский пакет должен импортировать пакет javax.naming. Добавьте это в список импортированных пакетов, обозначенных Import-Package.

Кстати, у вас могут быть дополнительные зависимости, которые обнаружатся отсутствующими после решения проблемы с javax.naming. Вам действительно не следует писать файл MANIFEST.MF вручную, потому что он подвержен ошибкам и содержит повторяющуюся информацию. Вам следует использовать такой инструмент, как bnd или Bndtools.

Обновление: Фактически OpenJPA не может импортировать пакет javax.naming, как показано в следующей части трассировки стека: «javax.naming.NamingException not found by org.apache.openjpa [109]» .

Поэтому OpenJPA не работает.

person Neil Bartlett    schedule 06.03.2013
comment
Спасибо за ваш ответ, Нил, но я все равно получаю ту же ошибку. Я использую инструменты IBM Rational Development для приложения OSGI. Таким образом, нет необходимости писать MANIFEST.MF вручную. Он будет генерировать. Я получил это от рынка затмения. В настоящее время я использую пакет openJpa версии 1.2.1. Может ли это не поддерживать JPA2.0. Я нашел пакет OpenJPA для OpenJPA версии 2. Пожалуйста, посоветуйте мне, где я ошибся. - person Java-Seekar; 06.03.2013
comment
О, я вижу при ближайшем рассмотрении сообщения об ошибке, что на самом деле OpenJPA не может импортировать пакет javax.naming. В этом случае OpenJPA не работает. Пожалуйста, сообщите об ошибке. - person Neil Bartlett; 06.03.2013
comment
Что касается того, где вы ошиблись... сначала вы использовали JPA... затем вы использовали инструменты IBM Rational ;-) - person Neil Bartlett; 06.03.2013
comment
Спасибо, Нил. Я использовал инструменты IBM Rational Development для создания этого пакета OSGI. Он поддерживает создание пакета с поддержкой JPA 2.0. Как вы упомянули выше, проблема с OpenJPA. Я проверю. Кстати, я хочу задать вам еще один вопрос. Я получил этот пакет OpenJPA от плагина eclipse. Я думаю, он не поддерживает JPA2.0. (Я добавляю плагин OpenJPA в eclipse и получаю пакет из папки плагинов eclipse.) Не могли бы вы сообщить мне, где я могу найти пакет OpenJpa, который поддерживает JPA2.0. ‹br› Спасибо - person Java-Seekar; 06.03.2013
comment
Возможно, инструмент предполагает, что загрузочное делегирование включено? - person BJ Hargrave; 06.03.2013

Попробуйте добавить javax.api в качестве зависимостей.

<dependencies>
    <module name="javax.api"/>
</dependencies>
person kds    schedule 13.05.2013

Попробуйте использовать -Dosgi.compatibility.bootdelegation=true, это помогло решить мою проблему

person Veselin    schedule 26.07.2018
comment
Любой, кто использует делегирование загрузки, должен прочитать wiki.eclipse.org/Equinox_Boot_Delegation. - person Dragas; 05.11.2018