Problema
Quando usar bibliotecas de terceiros em um pacote OSGi, você terá problemas de carregamento de classe, como os seguintes:
Fábrica solicitada mypackage.FooBar não pode ser localizada. Classloader =java.net.URLClassLoader@6aa8d01c
Observação: Este erro é apenas um exemplo de mensagem de erro. O problema é que as classes carregadas por bibliotecas de terceiros não são encontradas, mesmo que a classe correspondente seja importada definitivamente.
Exemplo do cotidiano
O Apache Axis2 poderá lançar o seguinte rastreamento de pilha sem motivo algum:
18.02.2010 17:04:30.153 *INFO* [10.43.97.19 [1266509048609] POST /path/to/servlet HTTP/1.1] org.apache.axis2.transport.http.HTTPSender Unable to sendViaPost to url[xy] org.apache.axis2.AxisFault: Requested factory com.ctc.wstx.stax.WstxOutputFactory cannot be located. Classloader =java.net.URLClassLoader@6aa8d01c em org.apache.axis2.AxisFault.makeFault (AxisFault.java:430) em org.apache.axis2.transport.http.AxisRequestEntity.writeRequest (AxisRequestEntity.java:96) na org. apache.commons.httpclient.methods.EntityEnclosingMethod.writeRequestBody (EntityEnclosingMethod.java:499) ...
Solução
A maneira como as bibliotecas de terceiros carregam suas classes está fora do seu controle. Na maioria dos casos, não haverá problema se a biblioteca de terceiros usar o carregador de classe normal do pacote. Mas às vezes uma biblioteca, como Apache Axis2, poderia tentar carregar uma classe como a seguinte:
Thread.currentThread().getContextClassLoader().loadClass("mypackage.FooBar");
Por padrão, o carregador de classes de contexto do Encadeamento não está ciente do OSGi e, portanto, não vê nenhuma das classes importadas no pacote configurável. É por isso que o carregamento da classe falha.
Em seu código, antes que o código de terceiros seja executado, você poderá ditar ao encademento atual para usar o carregador de classes do pacote. Faça isso temporariamente para o código de terceiros que não carrega algumas classes:
ClassLoader tccl = Thread.currentThread().getContextClassLoader(); Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader()); tente { // execute 3rd party code } finalmente { Thread.currentThread().setContextClassLoader(tccl); }
Aplica-se a
CQ 5.x, AEM6.x
Fazer logon em sua conta