OSGI를 프로젝트의 플러그인 관리 수단으로 사용하는 데 관심이 있습니다. 거기에는 내 인터페이스의 많은 구현자가있을 수 있습니다. 각 구현 클래스는 자체 구현 클래스가 포함 된 별도의 OSGI 번들로 나타납니다.인터페이스의 둘 이상의 구현 자. 어떻게 OSGi와 함께?
답변
Declarative Service 가야합니다.
당신은 번들 활성화 및 비활성화되는 방법을 정의 할 수 인터페이스의 service
<service>
<provide interface="my.Interface"/>
<property name="foo" value="bar"
</service>
각 구현으로 사용자 인터페이스를 선언 할 수 있습니다.
하지만 실제로 깔끔한 것은 그 성격입니다. 최신 SCR (새롭고 향상된 OSGi R4.2 DS - Declarative Service - 사양을 구현하는 "Extender 번들"인 "Service Component Runtime")을 사용하는 경우 클래스는 OSGI 모델에서 아무 것도 가져 오지 않습니다. 그들은 순수한 POJO로 남아 있습니다. 서비스를 감지하고 첫 번째 서비스의 모든 콘크리트 인스턴스를 나열하고 의도로 처리됩니다
<reference name="myInterfaceServiceName"
interface="my.Interface"
bind="myActivationMethod" unbind="myDeactivationMethod"
cardinality="0..n"/>
그건 :
그런 다음 첫 번째 서비스에 따라 다른 서비스를 정의합니다.
자세한 내용은 Eclipse Extensions and Declarative Services 질문을 참조하십시오.
EclipseCON2009의 프레젠테이션 : Component Oriented Development in OSGi with Declarative Services, Spring Dynamic Modules and Apache iPOJO은 구체적인 예를 제공합니다.
이것은 표준 서비스 레지스트리를 통해 런타임에 상세히 또는 동적으로 선언적으로 수행 할 수 있습니다 (VonC와 유사).
구현자는 서비스로 구현을 등록하고 소비자는 레지스트리에서 가져올 수 있습니다. 이것은 꽤 기본적인 OSGi입니다. 서비스는 속성으로 등록 될 수 있으므로 소비자는 서비스를 찾을 때 구현간에 구별하기 위해 이러한 속성을 사용할 수 있습니다.
네, 저도 알 겠지만 - wht 클래스가 "설치"또는 "활성화"하지 않고 번들에서 내보내는 것처럼 메타 데이터를 읽고 싶습니다. 가능합니다. –
이 모델에는 단 하나의 결함이 있습니다. 매우 수동적 인 것처럼 보이기 때문에 번들이 활성화 된 후에 만 찾을 수 있습니다. 활성화되기 전에 사용 가능한 번들 및 해당 내 보낸 유형의 디렉토리를 가져올 수 있기를 희망했습니다. 이것이 가능한가/어떻게? –
번들에 대해 배우기 위해서는 추적기가 있어야하지만 너무 늦었고 활성화/비활성 상태 인 컨트롤을 제어 할 수 없기 때문에 이것이 전적으로 가능하지는 않습니다. –