javax.imageio.spi.ServiceRegistry가 OSGi 컨테이너에서 작동합니까?

StackOverflow https://stackoverflow.com//questions/12664287

  •  11-12-2019
  •  | 
  •  

문제

호출하는 코드가 포함된 osgi 번들이 있는지 확실하게 말해 줄 수 있는 사람이 있습니까?

javax.imageio.spi.ServiceRegistry

META-INF\service에서 서비스를 찾으려면 해당 서비스 구현이 다른 번들에 있는 경우 해당 서비스를 찾습니다.

이에 대해 구체적인 문서를 찾지 못했습니다.나는 felix osgi 컨테이너를 사용하고 있습니다.어떤 조언이라도 감사히 받아들일 것입니다.

나는 그것이 작동한다고 생각하며 xdocreport osgi 번들에서 알 수 있듯이 내 문제는 다른 곳에 있습니다. fr.opensagres.xdocreport.core, ServiceRegistry 익숙해진다 여기 하지만 모든 osgi 컨테이너에서 지원되지는 않을까요?

도움이 되었습니까?

해결책 3

안녕하세요, 모두에게 답변을 보내주십시오. ServiceRegistry는 OSGi 컨테이너에서 서비스를 인스턴스화하는 것이지만 동일한 클래스 로더 내에서만 작동합니다. 그리고 그것은 "Nofollow"> OSGi Fragments 의 사용에 의해 촉진됩니다. 따라서 구현자가 ServiceRegistry 조회 코드가있는 클래스가 포함 된 번들로 해당 조각 호스트를 정의하는 조각에있는 한편으로 인해 ServiceRegistry가 작동합니다.

이렇게하면 내가 연결된 XDocReport 코드에서 일하는 이유입니다. 이 경우 serviceLoader 코드는 fr.opensagres.xdocreport.core (번들), fr.opensapres.xdocreport.document (ServiceRegistry Call은 fr.opensagres.xdocreport.document)입니다. 서비스 구현은 fr.opensagres.xdocreport.document.docx . frament-host as fr.opensagres.xdocreport.document .

so fr.opensagres.xdocreport.document 및 fr.opensagres.xdocreport.document.docx 동일한 클래스 로더를 사용하십시오 ... 그래서 작동합니다!

다른 팁

상자 중 OSGI는이 기능을 지원하지 않으므로 코드를 조정해야합니다. 그러나 Aries Spi Fly와 Pax-Swissbox 당신 이러한 SPI 사용 "서비스"

아니오, 그렇지 않습니다.나는 그것이 시스템 클래스 로더에서 서비스 만 발견 할 것이므로 번들에 꽤 쓸모가 없다고 생각합니다.

해결 방법이 있습니다.이 게시물 가 예쁘다.도움이되는 경우에도 도움이되지만 문제가 있는지 의심스럽지 만

또한 OSGi 5는 지원을 지원합니다 ( 'Service Loader Mediator').참조 구현은 "Nofollow"> Apache Aries에서 Spi Fly

XDocReport에서 우리는 모듈식 API 보고 관리하다:

  • 어느 문서 종류 (docx, odt, pptx...).원하는 경우 자신만의 문서 종류를 구현하고 javax.imageio.spi.ServiceRegistry를 통해 등록할 수 있습니다.
  • 모든 템플릿 엔진 종류(Freemarker, Velocity...).원하는 경우 자신만의 템플릿 종류를 구현하고 javax.imageio.spi.ServiceRegistry를 통해 등록할 수 있습니다.
  • 모든 변환기 유형(POI+iText가 있는 docx->pdf 변환기, POI가 있는 docx->xhtml 변환기, ODFDOM+iText가 있는 odt->pdf 변환기, ODFDOM이 있는 odt->xhtml 변환기...).원하는 경우 자체 변환기를 구현하고 javax.imageio.spi.ServiceRegistry를 통해 등록할 수 있습니다(예:docx4j+FOP를 사용하여 docx->pdf 변환기를 구현하고 JODConverter를 사용하여 docx->pdf 변환기를 구현합니다.

당신이 이해했듯이, javax.imageio.spi.ServiceRegistry는 OSGi 컨텍스트에서 작동합니다. 왜냐하면 우리는 OSGi 조각을 사용합니다 (동일한 클래스 로더 공유) OSGi 번들이 아닙니다.우리는 동일한 코드를 사용하여 비 OSGi 및 OSGi 컨텍스트를 모두 관리하기 위해 이 선택을 수행했습니다.

우리는 다음과 같은 이유로 OSGi 번들이 아닌 OSGi 조각을 사용하기로 결정했습니다.

  1. OSGi 번들을 사용하는 경우 발견을 등록하기 위해 OSGi Activator를 개발해야 합니다(이 컨텍스트 번들에서는 javax.imageio.spi.ServiceRegistry가 작동하지 않습니다).
  2. OSGi 번들을 사용하는 경우 검색을 등록하는 각 번들의 시작 수준을 구성해야 합니다.

OSGi 조각을 사용하는 유일한 단점은 OSGi 컨테이너에서 여러 버전의 XDocReport 템플릿, 변환기, 문서를 사용할 수 없다는 것입니다.하지만 XDocReport에 좋은 기능일까요?

그러시면 안됩니다 javax.imageio.spi.ServiceRegistry JDK5(및 JDK6)에서 작동합니다.JDK6은 다음을 제공합니다. java.util.ServiceLoader 이는 서비스를 javax.imageio.spi.ServiceRegistry로 등록하는 새로운 클래스입니다.

XDocReport에서는 JDK5+JDK6을 지원하려고 합니다.XDocReport 0.9.8만 사용됨 javax.imageio.spi.ServiceRegistry.하지만 Google App Engine에서는 이 클래스의 사용을 금지하는 것 같습니다. 이슈 132).그래서 저는 XDocReport 1.0.0용으로 개발했습니다. JDKServiceLoader Java 리플렉션으로 관리하려면 java.util.ServiceLoader 그리고 javax.imageio.spi.ServiceRegistry JDK5 및 JDK6용.

안젤로 안젤로

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top