Problema com biblioteca nativa

6 respostas
T

Estou usando duas bibliotecas nativas (.so) em um aplicação web, mas está ocorrendo um erro. Eu coloquei as bibliotecas em diretamente dentro da jre e quando executo a aplicação acontece o seguinte erro?

java.lang.UnsatisfiedLinkError: Native Library /usr/local/java/SUNWappserver/jdk/jre/lib/i386/client/libjLibSiTef.so already loaded in another classloader

O fato de estar em local comum a todas as aplicações pode estar levando a esse problema?

6 Respostas

jjose

carregue ela no mesmo classloader

T

Na verdade eu não estou carregando diretamente. Quem produziu a biblioteca me passou um jar com classes que abstraem isso. Além disso a aplicação é WEB. Tem como eu carregar em um mesmo classloader? Como eu faria isso?

jjose

cada webcontainer tem seu proprio classloader
tipo
se varias aplicacoes precisar desse cara
vc pode carregar no loader do webcontainer

T

Classes com bibliotecas nativas têm esse problema de classloading; para evitar isso:

  • Não usar classes com bibliotecas nativas (é claro que isso é irreal)
  • Ou então deixar disponível para todas as aplicações, para que a classe seja carregada apenas uma vez. Como se faz isso depende de seu web ou application container. O jeito mais estúpido e simples (e mais arriscado) é pôr essa biblioteca no diretório jre/lib/ext do Java que está sendo usado.
zirocool

Porque meu caro? Eu não ponho nada lá, nunca gostei, pq pra remover isso de lá é uma tortura depois.
Mas meu professor (na facul) insistia em mandar a gente meter as libs lá, pq dizia que esse era o diretório de extensão para outras bibliotecas.

T

É por isso que não gosto de bibliotecas nativas. O livro J2EE Antipatterns menciona o uso de bibliotecas nativas como um “anti-pattern” porque abre uma lata cheia de vermes na sua utilização.
Um dos problemas é que costumam deixar o web ou application container totalmente instável; outro deles é esse problema de classloading (onde a biblioteca não pode ser simplesmente “deployed” para uma única aplicação do application container; ela tem de ficar global para todas as aplicações.).
Se possível (se a redução de performance for aceitável), use um executável Java separado que acesse essa biblioteca e se comunique com o application/web container via sockets, por exemplo.
Assim, se o executável cair, só ele terá de ser reiniciado, não o web ou application container inteirinho.

Criado 19 de dezembro de 2007
Ultima resposta 19 de dez. de 2007
Respostas 6
Participantes 4