Problemas do carregador de classes no OSGi | Bibliotecas de Terceiros Usando o contexto do Encadeamento

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

Logotipo da Adobe

Fazer logon em sua conta