2012-01-10 3 views
0

나는 서버 측 응용 프로그램을 가지고 있으며 동적 번들로드를 위해 osgi 프레임 워크를 임베드하려고합니다.
다른 번들에서 사용할 IQuote (서버 컨테이너 부트 스트랩/Spring의 일부로 인스턴스화)를 구현하는 QuoteImpl을 노출하고자한다고 가정합니다.OSGI Embedded Equinox - osgi 프레임 워크에서 인스턴스화되지 않은 pojos에 액세스하기위한 번들

Q1. 서버 응용 프로그램 인스턴스를 번들에 노출시키는 명확한 방법이 있습니까? (때문에 btw 번들로 서버 코드를 만들 수 없습니다 :) :) donot 전체 응용 프로그램 osgi'ed 만들고 싶어.

서비스 및 번들을 통해 IQuote로 전송하려고 시도했습니다. 잘 수행하고 있는지 확신 할 수 없지만 IQuote가 번들 프로젝트와 반대되는 핵심 앱 프로젝트에 있기 때문에 해결되지 않은 컴파일 문제가 발생합니다. 어떤 아이디어?

답변

3

예 이렇게하는 방법은 서비스를 이용하는 것입니다. "호스트"응용 프로그램은 서비스를 게시하고 OSGi 내부의 번들은 정상적인 방법으로 서비스를 사용합니다.

이 기능을 얻으려면 서비스 번들 (IQuote이 포함 된 패키지)을 시스템 번들 내보내기를 통해 호스트 응용 프로그램에서 내 보내야합니다. 임베디드 OSGi 프레임 워크를 만들 때 org.osgi.framework.system.packages.extra 속성을 설정하여이를 제어 할 수 있습니다. 이 주제에 대해 blog post을 작성하여 시작하는 데 도움이 될 것입니다 (제목 "Exposing Application Packages"를 찾으십시오).

컴파일 문제가 있다고 말합니다. 이러한 문제를 해결하려면 프로젝트를 구성하고 시스템을 구축 한 방법을 알아야합니다.

+0

Neil 돌아와 주셔서 감사합니다. 저는 실제로 귀하의 블로그를 지침으로 사용했습니다. – Slash

+0

멋진 블로그 btw. 나는 컴파일 문제를 해결했다. 3 개의 프로젝트 견적 번들 (인터페이스 IQuote 포함), 소비자 번들 (IQuote 사용) 및 실행 프로그램 프로젝트 (내 응용 프로그램 서버 (번들이 아님)를 모방하고 프로그래밍 방식으로 서비스 IQuote의 구현을 등록 함)가 있습니다. context.getServiceReference (IQuoteService.class.getName());을 수행하려고 할 때 consumer 번들의 serviceReference에 NULL이 발생합니다. 내 질문은 : 분명히 나는 ​​뭔가를 놓친다. 구현에 번들이 있어야합니까? 실행기가 프레임 워크를 시작할 때 Activator에없는 서비스를 등록합니다. – Slash

+0

public static void main (String [] args) { \t .. \t FrameworkFactory frameworkFactory = ServiceLoader.load (FrameworkFactory.class) .iterator(). next(); config.put (Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA, "osgi.main"); 프레임 워크 프레임 워크 = frameworkFactory.newFramework (config); framework.start(); \t \t \t \t \t BundleContext context = framework.getBundleContext(); \t context.registerService (IQuoteService.class.getName(), 새로운 SimpleQuote(), null); \t .. } – Slash

관련 문제