2012-06-05 45 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包 - 就像一個檢查它是否會在所有的發現。通過這種方式,您將知道問題是出在包裝還是包裝上。

相關問題