我正在尝试在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
任何想法或解决方案? :)谢谢
答案 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”来查找)。我将在这里发布一个新的问题链接。