2012-06-05 5 views
0

Apache Felix에서 작은 EMF 기반 응용 프로그램을 실행하려고합니다. Felix가 Android 기기에서 실행 중입니다. 나는 이클립스를 사용하고 있지만 bnd가없고 maven이 없다. 내 플러그인 프로젝트의OSGi - 번들의 내부 패키지에 액티베이터가 액세스 할 수 없습니다.

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에

나는의 패키지를 내보내는 EMF 번들을 얻었다.

MANIFEST.MF는 : 나는은 OSGi의 번들을 설치하기 전에

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 

, 나는 그것을 "dexed"와 번들로 classes.dex를 추가했다.

내가 얻을 시작하려고하면

: NoClassDefFoundError를 enter image description here

어떤 아이디어 나 솔루션? :) 감사합니다

+0

매니페스트를 보면 번들이 많은 내부 패키지를 내보내는 이유는 무엇입니까? 예외에 대한 스택 추적이 있습니까? 리플렉션을 사용하여 EMF가 번들의 내부 클래스를로드합니까? Android를 사용하지 않을 때는 Equinox 또는 Felix를 사용하고 있습니까? –

+0

내부 패키지 가져 오기는 작동시키기위한 것일뿐입니다. 그 전에는 내부 패키지가없고 수출이없는 버전이있었습니다. EMF 반사가 사용되었는지는 확실하지 않지만 그렇게 생각합니다. 춘분,하지만 지금 나는 다시 펠릭스로 바뀌었다. 고맙습니다 ! –

답변

0

좋아요 50 % 완료되었습니다 ;-) 컴퓨터 (Java 1.6)에서 실행 중이지만 (여전히 Android에서는 안됨)! NoClassDefFoundError 오류가 내 사례에서 누락 된 버전 정보로 인해 발생했습니다. 익스포트 EMF-Bundle (b1)의 모든 패키지에 버전을 추가했습니다. 또한 가져 오기 알리미 - 번들 (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)의"행

번들 (b1)의 매니페스트 인 EMF 번들.

내 다음 문제는 안드로이드에있는 표준 시스템 번들의 내보내기가 일반 컴퓨터에서와 같이 다른 것으로 보입니다 (알아 내기 위해 "헤더"명령 사용). 나는 그 링크에 대한 새로운 질문을 여기서 시작하겠다.

0

EMF는 펠릭스 또는 춘분 이외의 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 패키지와 그 하위 패키지를 가져오고 있다고 대답 하겠지만 그 패키지는 아마도 번들 안에 들어있을 것입니다. 실제로 번들의 일부인 패키지를 가져 오면 안됩니다.

+0

업데이트 닐 주셔서 감사합니다, 재 포장은 github repo에서 영감을 얻었습니다;)하지만 나는 내 방식대로 했으므로 bnd에 약간의 문제가있었습니다. 가져 오기에서 패키지를 제거했습니다. 같은 문제 : - (( –

0

나는 이미 명백한 것을 확인했다고 가정 : *이 클래스 NotificationFactory 번들 내부에 존재입니다 의 이름과 경로 에 오타가 없는지 * * 클래스는 같은 내부 항아리 또는 떨어지게하지 않을 * 활성화 기가 시스템에 의해 성공적으로 발견 되었습니까? * 가져 오기를 제거하려고 시도 했습니까?

내가 제안 할 수있는 유일한 기괴한 점은 문제가 NotificationFactory 자체가 아닌 사용중인 클래스인지 여부입니다. 클래스 NotFound 실제로보고 된 클래스 안에 다른 클래스에 대한 다른 설치 프로그램에서 그런 경우가있었습니다.

예를 들어, com.androidosgi.notifier.notification 패키지에서 activator를 움직여보십시오. 전혀 발견되지 않는지 확인해보십시오. 이런 식으로 문제가 패키지에 있는지 또는 클래스 자체에 있는지 여부를 알 수 있습니다.