MouseOver Studio

MouseOver Studio header image 2

Classloaders e aplicações isoladas no JBoss

June 24th, 2008 por Diego Carrion · 1 comentário

Tudo começou com uma discussão sobre o classloader do Java. A discussão surgiu porque existiam duas aplicações que queriam compartilhar dados de uma classe estática localizada numa biblioteca x. Nesse momento surgiu a seguinte pergunta:

Como isolar aquelas duas aplicações de modo que possam utilizar uma biblioteca compartilhada que não possa ser utilizada por uma terceira aplicação?

Para responder a pergunta era necessário entender o conceito de classloader e também como trabalham os classloaders do servidor envolvido, que nesse caso era o JBoss.

Caso alguem não entenda muito bem o que são os classloaders e como eles trabalham, pode ler esse excelente post e lapidar o aprendizado com esse feedback muito bom do Rodrigo Kumpera.

Vou dizer que menti faz um pouco. Na verdade não é necessário entender o conceito de classloader para poder isolar aplicações devido a que JBoss torna o processo muito simples e transparente, mas eu acho conveniente para ter uma idéia de como funciona o negócio, o que é realizado por trás.

Mas então, o que deve ser feito? Existem varias alternativas mas a mais simples é criar um arquivo .ear contendo os projetos desejados e alterar o arquivo ear-deployer.xml localizado na pasta deploy do servidor JBoss. No arquivo mencionado devera ser trocado o valor do atributo Isolated para true:

<attribute name=\"Isolated\">true</attribute>

O JBoss utilizara um classloader para cada deploy ear, pelo que as aplicações dentro dele ficaram num contexto isolado.

Agora, o que acontece se eu tenho somente uma aplicação e quero que ela fique totalmente isolada, preciso por ela num ear? Não, nesse caso não, seria meio que uma gambiarra. No caso que queiramos um classloader para uma única aplicação e não um grupo delas o que devemos fazer é colocar as bibliotecas que desejamos sejam carregadas pelo classloader na pasta WEB-INF/lib da aplicação. Não tenho certeza se isto é uma especificação mas o JBoss Web e o Tomcat entendem que o que esta dentro da pasta WEB-INF é somente visível para a própria aplicação pelo que não teria sentido se as bibliotecas dentro da pasta lib fossem carregadas por um classloader de alto nível.

Finalmente, eu quero que minhas bibliotecas sejam visíveis para tudo mundo, onde devo colocar elas? Nesse caso a resposta é mais fácil, nesse caso basta colocar a biblioteca na pasta lib do servidor ou dentro de uma pasta (lib de preferencia) dentro do projeto ear, somente não esquecer de declarar ela no arquivo application.xml:

<library-directory>lib</library-directory>

Isso e tudo, não se esqueçam que agora a pagina conta com um formulário de contato e toda duvida sera respondida com plácer =)

Tags: Tutoriales · Uncategorized · java · jboss · tomcat

1 resposta ate agora ↓

  • 1 A. Rizzato // Mar 23, 2009 at 8:47 am

    What I find in my experience is that, at least in Jboss 4.x, one can’t isolate a web-module from others deployed in the same .EAR (isolated by deployment descroptor) since only the root deployment descriptor can set loaderRepository: this is annoying since others application servers such as websphere 6.1 can. I’ve tried to get an official confirmation of this in jboss’s user forum but no one could answer me. I don’t fully understand if you are dealing with this scenario in your post: what do you think?

Deixar um comentário