2013-03-07 3 views
0

필자는 펠릭스를 내장 할 수 있습니다. API 번들 및 Impl이 있습니다. API 내보내기 인터페이스 C .Impl은 해당 인터페이스를 가져 와서 activator에 impl을 등록합니다. 이제 C impl otside를 얻으려고합니다.임베디드 OSGi 프레임 워크에서 서비스 사용 중

FrameworkFactory ff = new FrameworkFactory(); 
    ... 
    BundleContext bc = fwk.getBundleContext(); 
    ... 
    final ServiceReference[] serviceReferences = bc.getServiceReferences(C.class.getName(), "(objectclass=" + C.class.getName() + ")"); 
    for(ServiceReference serviceReference : serviceReferences){ 
    final Object service = bc.getService(serviceReference); 
    ... 
    } 

이제 저는 그것과 상호 작용하고 싶습니다. 나는 반사

 System.out.println(service.getClass().getMethod("some").invoke(service)); //using 

와 함께 할 수 있습니다하지만 난 그 다른 클래스 로더에서 오는 추측 그것을

 System.out.println(service instanceof C); //prints false 

캐스팅 수 없습니다. 그러나 어떻게 해결할 수 있습니까? 우리는 외부에서 OSGi 컨텍스트를 인터럽트 할 수 있습니까? 아니면 우리 모두를 OSGi 컨테이너에 집어 넣을 수 있습니까?

답변

5

OSGi가 내장 된 경우 서비스 용 API (즉, 인터페이스 "C")는 외부 응용 프로그램에서 볼 수 있어야하며 시스템 번들 내보내기를 통해 OSGi로 내 보내야합니다. 외부 응용 프로그램은 OSGi 프레임 워크에 포함 된 번들에서 패키지를 가져올 수 없습니다.

+0

감사합니다. 그래서 Impl 번들'Export-Package : c.api; version = "1.0.0.SNAPSHOT" Import-Package : org.osgi.framework; version = "[1.5,2]"'로 작성하고' c.api' otside 묶음. 내가 맞습니까? –

+1

번호. C가 프레임 워크를 포함하는 일반 Java 클래스 경로에 있는지 확인하십시오. 그런 다음 프레임 워크를 시작할 때 C 패키지로 org.osgi.system.packages.extra (이름을 확인하십시오) 속성을 설정합니다. 그런 다음 번들은 해당 패키지를 가져와야합니다. –

+0

고마워요. 이제 작동합니다. –

관련 문제