| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/12/2007 09:59:39
|
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?
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/12/2007 10:06:07
|
jjose
Virtual Machine Man
![[Avatar]](/images/avatar/68be68a4c8ce0d9d97e5259a649ce6a4.jpg)
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/12/2007 10:09:27
|
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?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/12/2007 10:12:19
|
jjose
Virtual Machine Man
![[Avatar]](/images/avatar/68be68a4c8ce0d9d97e5259a649ce6a4.jpg)
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/12/2007 10:14:08
|
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/12/2007 11:25:28
|
zirocool
JavaEvangelist
![[Avatar]](/images/avatar/28659414dab9eca0219dd592b8136434.jpg)
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/12/2007 11:33:45
|
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.
|
|
|
 |
|
|