2012-08-08 6 views
1

OSGi 번들의 A와 B를 각각 x와 y 패키지로 내보내는 경우가 있다고 가정합니다. A가 B의 내보내기와 B의 내보내기에 종속되어있는 경우가 있습니다. 먼저 시작해야합니다. 다른 클래스의 공유 레지스트리 (예 : Activator 클래스가 아님)에서 ServiceReference를 가져온 다음 BundleContext 객체를 현재 번들의 컨텍스트로 초기화하는 방법을 가정합니다.두 개의 OSGi 번들 간의 상호 의존성

이것은 상호 의존성에 대해 위에서 언급 한 경우를 해결할 수 있습니다. A는 activator의 시작 메소드에서 B의 내보내기를 사용할 수 있고 B는 호출 할 때 다른 클래스의 메소드에서 A의 내보내기를 사용할 수 있습니다.

+0

A가 B에 의존하고 B가 A에 의존하는 경우 두 번들을 시작할 수 있습니까? bundlecontext에 대해서는 BundleContextAware 인터페이스가 있다고 생각합니다. –

+0

BundleContext bundleContext = FrameworkUtil.getBundle (JasperService.class) .getBundleContext(); ServiceReference empServiceReference = bundleContext.getServiceReference (yourclassname.class.getName()); – Nilesh

+0

이것은 액티베이터가 아닌 다른 클래스에서 현재 번들의 bundlecontext를 가져 오는 데 적합합니다. – Nilesh

답변

2

패키지 해결 (해결)은 번들 시작 및 실행과 다릅니다. 이 두 가지를 융합하지 않는 것이 중요합니다.

OSGi 프레임 워크는 패키지 종속성의주기를 해결할 수 있습니다. 따라서 번들이 해결되면 순서대로 시작할 수 있습니다. 상대적인 시작 순서에 따라 번들을 설계하지 않도록해야합니다. 그래서 서비스와 DS 같은 것을 사용하는 것입니다. 서비스 종속성의 순환은 해결할 수 없습니다. 따라서 이러한 순환을 피하십시오.

+0

유용 할 수있는 추가 기능 : 서비스 의존성 사이클 *은 사이클의 링크 중 하나 이상이 선택적이고 동적 인 한 작동 할 수 있습니다. –

+0

감사합니다. 필자가 발견 한 이러한 유스 케이스의 유일한 해결책은 상호 의존적 인 경우 두 번들을 병합하는 것입니다. 세 번째 번들을 만드는 것조차도 실현 가능하지 않았습니다. – Nilesh