sexta-feira, 11 de outubro de 2013

Ordem de carregamento de classes / jars no JBoss AS 7


INTRODUÇÃO

Nesse blog escrevi sobre isolamentos de classloaders no JBoss AS 7.
Vejam nesse link:

http://www.josepojr.com/2013/01/isolamento-de-classloaders-no-jboss-as-7.html

Mas gostaria de complementar com mais explicações sobre a ordem usada no carregamento de classes / jars no JBoss AS 7.


CONCEITOS

1 - Só criar módulos no JBoss 7 se for alguma API que será usada em vários projetos (WAR ou EAR) que serão implantados (deploy) no JBoss 7.

2 - Dentro de um EAR, pode-se colocar os jars dentro dos seus respectivos subprojetos. Ou seja, se no seu EAR tem dois wars e um jar (Projeto EJB), um jar que será usado em somente um war, pode ser colocado dentro da pasta WEB-INF/lib desse respectivo war. Agora, se o seu jar é usado em todos os subprojetos do ear, usar dentro do diretório EAR/lib.

3 - O JBoss 7 tem uma regra de procedência para decidir qual classe de qual jar carregar primeiro. Veja em:

https://docs.jboss.org/author/display/AS71/Class+Loading+in+AS7


Resumindo a regra usada, de acordo com a prioridade:

1º Carregar classes de sistemas do JRE e JavaEE (especificação).
2º Dependências declaradas explicitamente no arquivo jboss-deployment-structure.xml
3º Classes / jars internos dos subprojetos como WEB-INF/classes ou WEB-INF/lib para um projeto WAR.
4º Jars contidos na pasta EAR/lib do seu projeto EAR.


Essas regras são muito importantes para o desenvolvimento de aplicações no JBoss AS 7. Se sua classe estiver no mesmo pacote e mesmo nome (exemplo meupacote.MinhaClasse) e estiver em dois lugares como WEB-INF/lib e EAR/lib, o JBoss AS 7 carregará a classe que achará primeiro. E pela regra da prioridade, pegará a classe MinhaClasse que está no jar do subprojeto WAR pasta WEB-INF/lib. Se a classe MinhaClasse estiver também em um outro jar da pasta EAR/lib, a classe nesse pacote não será carregada.


CONCLUSÃO

A equipe de projeto e desenvolvimento do JBoss AS 7, tiveram que elaborar algum mecanismo para definir em casos de "dúvidas" qual classe será carregada, no caso de existirem classes como mesmo nome e pacote dentro do servidor JBoss AS 7. Essas regras visam tomar decisões para em tempo de execução, o JBoss AS 7 resolver o impasse e escolher uma classe dentro de um conjunto de N classes de mesmo pacote e nome. Claro que nesse cenário estamos lidando com o pior caso, de temos a mesma classe e no mesmo pacote e M versões distintas e rodando no mesmo servidor de aplicações JBoss AS 7.



Nenhum comentário:

Postar um comentário