OSGi - Активатор не может получить доступ к внутренним пакетам Bundle

Я пытаюсь запустить небольшое приложение на основе EMF на Apache Felix. Felix работает на Android-устройстве. Я использую Eclipse, но без bnd и без maven.

У меня есть пакет EMF, который экспортирует пакеты:

org.eclipse.emf.common_droid-2.7.0.v20120127-1122.jar
org.eclipse.emf.ecore_droid-2.7.0.v20120127-1122.jar
org.eclipse.emf.ecore.xmi_droid-2.7.0.v20120127-1122.jar

Структура моего плагина-проекта:

[+] src
---> com.androidosgi.notifier
---> com.androidosgi.notifier.notification
---> com.androidosgi.notifier.notification.impl
---> com.androidosgi.notifier.notification.util
[+] META-INF
---> MANIFEST.MF
Notification-1.0.ecore
Notification-1.0.ecorediag
Notification-1.0.ecorert
NotificationComponent.xmi

Активатор находится в com.androidosgi.notifier.

МАНИФЕСТ.MF:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Notification Testing
Bundle-SymbolicName: com.androidosgi.notifier
Bundle-Version: 12.6.5
Bundle-Activator: com.androidosgi.notifier.Activator
Bundle-Vendor: Homer Simpson
Import-Package: 
 com.androidosgi.notifier.notification,
 com.androidosgi.notifier.notification.impl,
 com.androidosgi.notifier.notification.util,
 org.eclipse.emf.common,
 org.eclipse.emf.common.archive,
 org.eclipse.emf.common.command,
 org.eclipse.emf.common.notify,
 org.eclipse.emf.common.notify.impl,
 org.eclipse.emf.common.util,
 org.eclipse.emf.ecore,
 org.eclipse.emf.ecore.impl,
 org.eclipse.emf.ecore.plugin,
 org.eclipse.emf.ecore.resource,
 org.eclipse.emf.ecore.resource.impl,
 org.eclipse.emf.ecore.util,
 org.eclipse.emf.ecore.xmi,
 org.eclipse.emf.ecore.xmi.impl,
 org.eclipse.emf.ecore.xmi.util,
 org.eclipse.emf.ecore.xml.namespace,
 org.eclipse.emf.ecore.xml.namespace.impl,
 org.eclipse.emf.ecore.xml.namespace.util,
 org.eclipse.emf.ecore.xml.type,
 org.eclipse.emf.ecore.xml.type.impl,
 org.eclipse.emf.ecore.xml.type.internal,
 org.eclipse.emf.ecore.xml.type.util,
 org.osgi.framework;version="1.3.0"
Bundle-ClassPath: .
Export-Package: com.androidosgi.notifier;x-internal:=true,
 com.androidosgi.notifier.notification;x-internal:=true,
 com.androidosgi.notifier.notification.impl;x-internal:=true,
 com.androidosgi.notifier.notification.util;x-internal:=true

Перед тем, как я установил пакет на OSGi, я «расшифровал» его и добавил class.dex в пакет.

Если я пытаюсь запустить, я получаю: NoClassDefFoundError введите здесь описание изображения

Любые идеи или решения? :) Спасибо


person Rob Anderson    schedule 05.06.2012    source источник
comment
Глядя на ваш манифест, почему ваш пакет экспортирует так много своих внутренних пакетов? У вас есть трассировка стека для исключения? Использует ли EMF отражение для загрузки внутренних классов вашего пакета? Когда вы работаете вне Android, вы используете Equinox или Felix?   -  person Holly Cummins    schedule 06.06.2012
comment
импорт внутренних пакетов был просто попыткой заставить его работать. До этого у меня была версия без внутренних пакетов и без экспорта. Я не уверен, использовались ли отражения ЭМП, но я думаю, что да. Equinox, но теперь я снова вернулся к felix. СПАСИБО !   -  person Rob Anderson    schedule 08.06.2012


Ответы (3)


EMF не будет работать на Felix или любой другой платформе OSGi, кроме Equinox. См. следующую ошибку, о которой я упоминал давно: https://bugs.eclipse.org/bugs/show_bug.cgi?id=328227

Вы должны использовать переупаковку EMF, которая правильно выполняет объявления OSGi. У меня есть это на GitHub, но сейчас оно немного устарело, т.е. содержит старую версию EMF. См.: https://github.com/njbartlett/emf-osgi.

ОБНОВЛЕНИЕ: я был слишком поспешным, возможно, это был неправильный ответ. Похоже, вы уже переупаковали EMF.

Я подозреваю, что ответ заключается в том, что вы импортируете пакет com.androidosgi.notifier.notification и его подпакеты, но, вероятно, это пакеты внутри вашего пакета. Вы не должны импортировать пакеты, которые на самом деле являются частью вашего пакета.

person Neil Bartlett    schedule 05.06.2012
comment
Спасибо за обновление, Нил, переупаковка была вдохновлена ​​​​вашим репозиторием на github;) но у меня были некоторые проблемы с bnd, поэтому я сделал это по-своему. Я удалил пакеты из импорта. Та же проблема :-(( - person Rob Anderson; 06.06.2012

Я полагаю, вы уже проверили очевидные вещи: * Класс NotificationFactory присутствует внутри бандла * В имени и пути нет опечаток * Класс не находится во внутренней банке или что-то в этом роде * Активатор успешно найден система? * Вы пытались удалить импорт?

Единственная более странная вещь, которую я могу предложить проверить, заключается в том, может быть, проблема не в самом NotificationFactory, а в каком-то классе, который он использует. У меня были такие случаи в других установках, где ClassNotFound фактически был для другого класса внутри сообщаемого класса.

Попробуйте например переместить активатор в пакет com.androidosgi.notifier.notification - просто как проверку найдется ли он вообще. Таким образом вы узнаете, связана ли проблема с пакетом или с самим классом.

person pooh    schedule 06.06.2012

Хорошо, 50% готово ;-) Он работает на компьютере (Java 1.6) (но еще не на Android)! Ошибка NoClassDefFoundError, вызванная в моем случае отсутствующим материалом для управления версиями. Я добавил версию в каждый пакет в экспортирующем EMF-Bundle (b1). Я также добавил диапазоны версий для каждого пакета при импорте Notifier-Bundle(b2). Похоже, очень важно установить версии. Я также удалил:

com.androidosgi.notifier.notification, com.androidosgi.notifier.notification.impl, com.androidosgi.notifier.notification.util,

из импорта Bundle(b2) и всего экспорта из (b2). Сейчас он работает на Apache Felix.

Угу, я еще добавил

Пакет импорта: org.xml.sax.helpers;version="[0.0.0.1_006_JavaSE,3.0.0)"

к манифесту Связки (b1), EMF-Связки.

Моя следующая проблема заключается в том, что экспорт стандартного системного пакета в Android кажется другим, чем на обычном компьютере (чтобы узнать, использовал команду «заголовки»). Я начну новый вопрос для того, чтобы опубликовать ссылку здесь.

person Rob Anderson    schedule 08.06.2012