Problema com biblioteca nativa  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
thiago_algo
JavaTeenager

Membro desde: 27/07/2004 11:23:41
Mensagens: 186
Offline

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?
jjose
Virtual Machine Man
[Avatar]

Membro desde: 22/05/2007 23:10:22
Mensagens: 663
Localização: Paraiba
Offline

carregue ela no mesmo classloader

Estatísticas mostram que no RJ você corre risco de levar um tiro antes mesmo de nascer.
No RJ proporção é de uma bala perdida por cada gota de chuva.
No RJ quando o assunto é bala perdida, o óbito considera causas naturais.

[Email] [WWW]
thiago_algo
JavaTeenager

Membro desde: 27/07/2004 11:23:41
Mensagens: 186
Offline

jjose wrote:carregue ela no mesmo classloader


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
Virtual Machine Man
[Avatar]

Membro desde: 22/05/2007 23:10:22
Mensagens: 663
Localização: Paraiba
Offline

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

Estatísticas mostram que no RJ você corre risco de levar um tiro antes mesmo de nascer.
No RJ proporção é de uma bala perdida por cada gota de chuva.
No RJ quando o assunto é bala perdida, o óbito considera causas naturais.

[Email] [WWW]
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

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.
[WWW]
zirocool
JavaEvangelist
[Avatar]

Membro desde: 06/11/2004 17:00:05
Mensagens: 472
Localização: Candelária - RS
Offline

thingol wrote:
...
- ... 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.
[WWW] [ICQ]
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

É 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.
[WWW]
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team