2016-07-23 3 views
-1

osgi 번들이 아닌 jar 파일이 있습니다. 선발이라고 부르 자. 병. 그리고 저는이 스타터를 다음과 같이 실행합니다 : java -jar starter.jar. 이 스타터는 felix 프레임 워크를 시작합니다 :OSGI : systemBundle을 통해 osgi 컨테이너 외부 서비스 사용

Felix felix = new Felix(configMap); 
systemBundle=felix.getBundle(); 

그리고 나서 일부 서비스를 내보내는 osgi 번들을 설치하고 시작합니다.

그래서 스타터는 osgi 컨테이너 외부에 있지만 systemBundle을 참조합니다. starter.jar에서 일부 osgi 서비스를 사용할 수 있습니까?

EDIT 이제 내가 (starter.jar의 코드) 솔루션을 작업했기 때문에이 가능하다는 것을 알고

BundleContext bundleContext=systemBundle.getBundleContext(); 
ServiceReference reference = bundleContext.getServiceReference(Temp.class.getName()); 
Object server = (Object) bundleContext.getService(reference); 
Method method = server.getClass().getMethod("getString"); 
Object result=method.invoke(server); 

나는 때문에 다른 클래스 로더의 ClassCastExceptions과있어 나는이 반사를 사용했다 . 그리고 최종 해결책은 오히려 못생긴 것입니다. 어쩌면 누군가가 더 나은 방법을 제공 할 것입니다. 아니면 네트워크 소켓을 통하는 것 외에는 다른 방법이 없을까요?

+0

서비스 인터페이스가 포함 된 패키지를 포함 된 OSGi 컨테이너의 시스템 패키지에 추가 할 수 있습니다. 이 경우 리플렉션없이 서비스를 사용할 수 있습니다. –

+0

@ Balazs Zsoldos 나는 시도 할 것이다. 아주 좋은 생각 인 것 같아. –

답변

1

적용 할 두 가지 중요한 규칙이 있습니다 :

  1. 같은 수출에서 모두이 API 패키지를 가져와야합니다 서비스 (서비스 인터페이스를 정의 즉, 패키지)의 공급자와 소비자 . 이것은 여러 가지 방법으로 배열 될 수 있습니다. 공급자와 소비자 모두 세 번째 API 번들에서 가져 오기 ... 또는 공급자가 패키지와 소비자 가져 오기를 내보낼 수 있습니다. 또는 드물게 소비자가 패키지를 내보낼 수 있으며 공급자가 가져올 수 있습니다.

  2. 시스템 번들 은 일반 번들의 패키지을 가져올 수 없습니다. 오직 내보낼 수 있습니다.

두 번째 규칙은 시스템 번들 및 일반 번들 간의 서비스와 통신 할 때 API 패키지가 시스템 번들의 클래스 패스에 넣어되어야하며 org.osgi.framework.system.packages.extra를 사용하여 내 보낸 것을 의미한다. 그런 다음 일반 번들은 정상적인 방법으로 패키지를 가져옵니다. 시스템 번들이 서비스 제공자인지 서비스 제공자인지 여부에 관계없이이 방법으로해야합니다.