2012-06-05 47 views
0

我试图在Apache Felix上运行一个基于EMF的小型应用程序。 Felix正在Android设备上运行。我使用Eclipse,但没有bnd和没有maven。OSGi - Activator无法访问Bundle的内部软件包

我得到了一个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。

的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

任何意见或解决方案? :)谢谢

+0

看你的表现,为什么你的包出口这么多的内部包? 你有没有异常堆栈跟踪? EMF是否使用反射来加载你的包的内部类? 当你运行Android之外,您使用的春分或菲利克斯? –

+0

内部软件包的导入只是为了使其工作。在此之前,我有一个没有内部软件包和没有出口的版本。 我不知道是否使用EMF反射,但我是这么认为的。春分,但现在我又变回了费利克斯。谢谢 ! –

回答

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,

从捆绑(b2)的进口和(b2)的所有出口。 它现在在Apache Felix上运行。

呃,我还添加

导入级封装: org.xml.sax.helpers中;版本= “[0.0.0.1_006_JavaSE,3.0.0)”

到Bundle(b1)的EMF-Bundle。

我的下一个问题是,在Android的标准systembundle的出口似乎被指出错误,因为它是一个正常的计算机(使用命令“头”来查找出来)上。我将开始一个新的问题,在这里发布链接。

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

UPDATE:我太匆忙了,可能不是正确的答案。它看起来像你已经重新包装EMF。

我怀疑,答案是要导入的包com.androidosgi.notifier.notification及其子包,但这些可能是你的包内包。你不应该导入实际上是你的包的一部分的包。

+0

感谢更新尼尔,重新包装是由您的GitHub库的启发;),但我有一些问题,BND,所以我走自己的路。我从导入中删除了包。同样的问题 :-(( –

0

我想你已经检查了明显的事情: *类NotificationFactory存在管束内 *有在名称和路径 没有错别字*类是不是在内部罐或不服这样的 *激活器是否被系统成功找到? *您尝试删除导入?

唯一我可以提出来检查更离奇的事情是,是否可能的问题不在于NotificationFactory本身,但也有一些类,它使用。在其他设置中,ClassNotFound实际上是为报告的类中的另一个类提供的。

尝试例如移动激活在com.androidosgi.notifier.notification包 - 就像一个检查它是否会在所有的发现。通过这种方式,您将知道问题是出在包装还是包装上。

相关问题