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?
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?
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.
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.
É 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.