0

我正在尝试在 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

激活器位于 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 上安装包之前,我对其进行了“索引化”并将 classes.dex 添加到包中。

如果我尝试开始,我会得到:NoClassDefFoundError 在此处输入图像描述

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

4

3 回答 3

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;version="[0.0.0.1_006_JavaSE,3.0.0)"

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

我的下一个问题是,android 中标准 systembundle 的导出似乎与普通计算机上的不同(使用命令“headers”来查找)。我将为此开始一个新问题,并在此处发布链接。

于 2012-06-08T10:21:38.473 回答
0

EMF 不会在 Felix 或除 Equinox 之外的任何 OSGi 框架上运行。请参阅我很久以前提出的以下错误:https ://bugs.eclipse.org/bugs/show_bug.cgi?id=328227

您必须使用正确执行 OSGi 声明的 EMF 重新打包。我在 GitHub 上有这个,但它现在有点陈旧,即它打包了旧版本的 EMF。见:https ://github.com/njbartlett/emf-osgi

更新:我太仓促了,这可能不是正确的答案。看起来你已经重新打包了 EMF。

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

于 2012-06-05T20:01:22.940 回答
0

我想您已经检查了明显的事情: * 捆绑包中存在类 NotificationFactory * 名称和路径中没有拼写错误 * 该类不在内部 jar 或类似的东西中 * 激活器已成功找到系统?* 你试过删除导入吗?

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

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

于 2012-06-06T07:39:45.263 回答