OSGi - Activator无法访问Bundle的内部包

时间:2012-06-05 18:48:32

标签: android eclipse osgi noclassdeffounderror emf

我正在尝试在Apache Felix上运行一个基于EMF的小应用程序。 Felix正在Android设备上运行。我正在使用Eclipse但没有bnd且没有maven。

我有一个出口包裹的EMF Bundle:

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

Activator位于com.androidosgi.notifier。

MANIFEST.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上安装捆绑包之前,我“dexed”它并将classes.dex添加到捆绑包中。

如果我尝试开始我得到:NoClassDefFoundError enter image description here

任何想法或解决方案? :)谢谢

3 个答案:

答案 0 :(得分:0)

EMF不会在Felix或Equinox以外的任何OSGi框架上运行。请参阅我在很久以前提出的以下错误: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及其子包,但这些包可能是您包中的包。您不应该导入实际上是捆绑包的包。

答案 1 :(得分:0)

我想你已经检查了明显的事情: *类NotificationFactory存在于bundle中 *名称和路径中没有拼写错误 *这个班不是像这样的内部jar或smth *系统成功找到了激活器? *您尝试删除导入?

我可以建议检查的唯一更奇怪的事情是,问题可能不是NotificationFactory本身,而是它使用的某个类。我在其他设置中遇到过这样的情况,其中ClassNotFound实际上是报告类中的另一个类。

尝试例如在com.androidosgi.notifier.notification包中移动激活器 - 只是检查它是否会被找到。通过这种方式,您将了解问题是关于包还是类本身。

答案 2 :(得分:0)

确定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中;版本= “[0.0.0.1_006_JavaSE,3.0.0)”

到Bundle(b1)的清单,即EMF-Bundle。

我的下一个问题是android中标准系统的出口似乎与普通计算机不同(使用命令“headers”来查找)。我将在这里发布一个新的问题链接。