Pessoal,
estou refatorando um projeto um pouco extenso e para facilitar a manutenção e o trabalho com o mesmo eu o dividi em vários subprojetos em um projeto EE.
O problema é que esses projetos usam classes um dos outros e quando eu vou iniciar os mesmos vários ClassNotFoundExceptions são lançadas pelo JBoss. A solução que eu encontrei até agora é jogar as classes desses projetos em projetos do tipo utility e, por sua vez, referenciar os JARs gerados nos outros projetos, dessa forma eu não teria os problemas mencionados acima.
O que eu quero saber é se existe algum padrão melhor para aplicar nessa refatoração.
Levem em conta que eu estou tirando um projeto do caos e levando até alguma maturidade, mas ainda está fora da realidade implantar o estado da arte neles.
Obrigado.
Acho que hoje o padrão para gerenciamento de dependências é o Maven. Se você não usa uma IDE que ofereça parte desse gerenciamento “de graça”, como o Eclipse, eu não vejo outra saída, exceto manter o que você já tem.
Obrigado pela resposta, atualmente eu estou usando o eclipse ele gera meu EAR com as libs e os respectivos WAR. Mas o problema é que eu possuo classes em um Projeto A que são referenciadas pelo Projeto B (coloquei o Projeto A no buildpath do Projeto B), e quando a aplicação sobe no JBoss o mesmo lança uma série de ClassNotFoundExceptions.
O que eu gostaria de fazer era configurar o ClassLoading do JBoss 5.1 (>=) para que as classes de um projeto pudessem ser referenciadas em outro, mas não sei se isso é configuração do ClassLoading do JBoss ou configuração do projeto EAR.
Andei dando uma lida nas referências do JBoss sobre classloading e ví coisas relacionadas a isolamento, mas não tive sucesso nas configurações sugeridas.
Bom dia.
Como você está refatorando adotando a premissa de dividir o projetos em subprojetos que dependem de classes
um do outro.
o ideal seria que sempre que houvesse uma alteração em um dos subprojetos você publicasse o seu respectivo jar em
um repositório.Os demais subprojetos acessariam este repositório através do maven.
Desta maneira todos os subprojetos ficariam as libs atualizadas durante a refatoração.
Você pode usar ferramentas como Hudson ou Cruise Control para automatizar sua processo de publicação das lib.
O projeto A e o projeto B são utility JARs no Eclipse WTP?
A estrutura atual é a seguinte
|PROJETO EE (EAR)
||Projeto A(WAR - Dynamic Web Module)
||Projeto B(WAR - Dynamic Web Module)
||Projeto ARQ - (JAR - Utility)
||Projeto UTIL - (JAR - Utility)
O ideal seriam que essas classes que são comuns aos outros projetos estivessem em um projeto do tipo Utility, dessa forma eu não teria problemas. Mas essa é uma situação longe da que eu posso conseguir, dado que esses projeto possui muitas classes que envolvem dependencias entre os projetos, por isso essa solução de tentar fazer (via classloading ou de outra forma) um war conseguir enxergar as classes de outro war.
Obrigado.
[quote=Daniel.F]Bom dia.
Como você está refatorando adotando a premissa de dividir o projetos em subprojetos que dependem de classes
um do outro.
o ideal seria que sempre que houvesse uma alteração em um dos subprojetos você publicasse o seu respectivo jar em
um repositório.Os demais subprojetos acessariam este repositório através do maven.
Desta maneira todos os subprojetos ficariam as libs atualizadas durante a refatoração.
Você pode usar ferramentas como Hudson ou Cruise Control para automatizar sua processo de publicação das lib.[/quote]
Bom dia Daniel,
o problema é que essas classes que são comuns ainda não estão em um projeto Utility, como são muitas classes (muitas mesmo) e as dependências são muitas eu estou tentando fazer essas classes que estão em um projeto web enxergar as classes de outro projeto. Mas a situação ideal é que essas classes estivessem em um projeto utility, nesse nível eu conseguiria trabalhar da forma que você sugeriu. Obrigado!
Cara, não é a situação ideal. É a situação mínima…
Qual a dificuldade para empacotar essas classes todas em um único utility JAR?
A dificuldade é que são 18 projetos (14 web (war)e 4 de arquitetura(jar) após a divisão) cada um com centenas de classes.
O problema tá em analizar todas as classes, uma a uma, referencia por referencia e alterar esses fontes.
Mas existe duplicação de classes (mesmo pacote e mesmo nome) entre esses 18 projetos?
Não,
esses 18 projetos fora originados a partir de um só (a situação era caótica tanto para manutenção quanto para desenvolvimento).
O problema de referencias eu resolvi colocando um projeto no build path do outro (via eclipse), mas no deploy é como se um projeto na visualizasse o outro.
O que acontece é eu ter classes como
br.com.portal.pkga.Classe1 em um projeto e
br.com.portal.pkga.Classe2 em outro projeto
onde Classe2 usa referencias da Classe1 mas por Classe1 pertencer ao contexto do projeto 1 este não está mais no mesmo projeto da a Classe2 que pertence ao contexto do projeto 2
Obrigado
Criar a dependência entre os projetos web foi um erro. Isso viola a spec J2EE e é por isso que não funciona quando você implanta no App Server.
Se eu fosse você, criaria um um utility “shared” e colocaria lá classes que são usadas por mais de um Web Module.
Concordo com você, após as pesquisas é a solução a ser adotada - que eu comecei pela manha =D.
Obrigado pelos comentários.
Caso alguém chegue no mesmo dilema que eu a solução adotada foi a seguinte.
Para cada projeto web A, B, C, D, E … N que possua classes compartilhadas com outros projetos web (no meu caso todos possuem dependencias) eu criei projetos seguindo a nomenclatura ProjetoA e ProjetoASource onde ProjetoA é o módulo web e o ProjetoASource é um projeto utility (JAR) onde eu coloco todas as minhas classes. Após isso as classes podem ser referenciadas normalmente. Com isso, ainda, acredito que ganha-se em organização do projeto.
É isso.
Obrigado a todos que comentaram e me ajudaram a chegar nessa solução.
O próximo passo é identificar se há dependências cíclicas no seu projeto, ou seja, se o JAR A depende de B e B depende de A.
Na verdade existem, mas já estão sendo identificadas e solucionadas.
Daqui a um tempo, quando as coisas estiverem com uma melhor organização, eu quero tentar solucionar essas dependências com o Spring injetando-as nos respectivos projetos.
oi,
porque você não coloca todas as dependências no EAR e referencia elas nos outros módulos? ai no ear você tem configurações gerais de todos os projetos, pode separar em mais de um ear também, dependendo do seu contexto.
abs
André, acho que ele já fez isso. O problema é que havia dependência entre classes empacotadas dentro de módulos Web diferentes.