Foi útil?

Solução 3

Oi obrigado a todos por suas respostas. Eu acho que a ServiceRegistry funcionará em um contêiner OSGI para instanciar um serviço, mas apenas dentro do mesmo carregador de turma. E isso é facilitado pelo uso de fragmentos OSGi . Então, desde que o implementador esteja em um fragmento que defina seu fragmento-host como o pacote que contém a classe que possui o código de pesquisa do ServiceRegistry, então a ServiceRegistry funcionará.

É por isso que está funcionando no código XDOCreport que vizinho. Neste caso, o código do serviceloader é chamado de uma classe abstrata em fr.opensagres.xdocreport.core (um pacote), que é estendido por Classe de concreto em fr.opensagres.xDocreport.document (então a chamada de serviceregistry está no fr.opensagres.xdocreport.document). A implementação do serviço está no fr.opensagres.xdocreport.document.docx . Um fragmento cujo definiu seu fatal como fr.opensagres.xDocreport.document .

assim fr.opensagres.xdocreport.document e fr.opensagres.xdocreport.document.docx Use o mesmo carregador de classe ... por isso funciona!

Outras dicas

Fora da caixa, OSGI não suporta isso, você precisará ajustar o seu código um pouco. Mas há ferramentas ao redor como Áries Spi Fly e pax-swissbox esse suportevocês Ao usar esses "serviços" SPI

Não, não.Acho que só descobrirá serviços no carregador de classes do sistema, de modo que é muito inútil para pacotes.

Pode haver uma solução alternativa, esta post é bonitoútil, embora eu duvide se é de qualquer uso para o seu problema.

Também o OSGI 5 terá suporte para ele ('Service Loader Mediator').A implementação de referência é voo SPI de Apache Aries

No XDOCreport, queríamos ter um relatórios de API modular para gerenciar:

  • Qualquer document gentil (Docx, ODT, PPTX ...). E você pode implementar seu próprio documento gentil se desejar e registrá-lo via javax.imageio.spi.serviceregistry.
  • qualquer tipo de motor de modelo (Freemarker, velocidade ...). E você pode implementar seu próprio tipo de modelo se desejar e registrá-lo via javax.imageio.spi.serviceregistry.
  • qualquer tipo de conversão (Docx-> PDF Converter com POI + IText, Docx-> XHTML Converter com POI, ODT-> PDF Converter com Odfdom + IText, ODT-> XHTML Converter com Odfdom ...). E você pode implementar seu próprio conversor se desejar e registrá-lo via javax.imageio.spi.serviceregistry (ex: implementar Docx-> PDF Converter com Docx4J + FOP, Docx-> Conversor PDF com JodConverter, etc).

    Como você entendeu, javax.imageio.spi.serviceregistry funciona no contexto OSGi porque usamos fragmento OSGi (compartilhe o mesmo carregador) e não o pacote OSGI. Temos feito esta opção para gerenciar o contexto não OSGI e OSGI, ambos com o mesmo código.

    Decidimos usar o fragmento OSGI e não o pacote OSGI porque:

      .
    1. Se usarmos um pacote OSGI, precisamos desenvolver um ativador OSGI para registrar nossa descoberta (neste conjunto de contexto, javax.image.spi.serviceregistry não funciona).
    2. Se usarmos o Bundle OSGI, você precisará configurar o nível de início para cada pacotes que registram a descoberta.

      O único Disavage para usar o fragmento OSGI é que você não pode usar em seu contêiner OSGI várias versão do XDOCreport Modelo, conversor, documento. Mas é uma boa característica para o XDOCreport?

      Você não deve que javax.imageio.spi.serviceregistry funciona com JDK5 (e JDK6). O JDK6 fornece java.util.serviceloader , que é novo Clas para os Serviços de Regsiter como Javax.Imageio.spi.serviceregistry.

      No XDOCreport Desejamos suportar JDK5 + JDK6. XDOCreport 0.9.8 Usado apenas javax.imageio.spi.serviceregistry . Mas parece que o Google App Engine proíbe o uso desta classe (veja o nosso problema 132 ). Então eu desenvolvi para XDOCreport 1.0.0 jdkserviceloader Para gerenciar com o reflexão Java java.util.serviceloader e javax.imageio.spi .Serviceregistic para jdk5 e jdk6.

      Atenciosamente Angelo

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top