O javax.imageio.spi.serviceregistry funciona em um contêiner OSGI?
-
11-12-2019 - |
Pergunta
Alguém pode me dizer definitivamente se um pacote OSGI que contenha código que chama
javax.imageio.spi.serviceregistry
Eu suspeito que funcione e meu problema reside em outro lugar Como eu percebo que no XDOCreport OSGi Bundle GeneracodicCode, fr.opensagres.xdocreport.core
é usado Aqui masTalvez não seja suportado em todos os contêineres OSGI?
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:
- .
- 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).
- 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