Olá pessoal tenho o seguinte cenário em um projeto em particular aqui :
1 PROJETO COM 3 MODULOS :
PROJETO 1 - POSSUI TODO O MODELO DE NEGÓCIO RELATIVO AS TABELAS COMUNS A OUTROS 2 MODULOS (ex : Estado , Cidade , Usuario , Perfil , etc,etc)
PROJETO 2 - DEPENDE DO PROJETO 1 POIS UTILIZA EM SEU MODELO DE NEGOCIO CLASSES COMUNS (ex : PessoaFisica , Endereco (Depende de estado, cidade que está no módulo 1)
PROJETO 3 - DEPENDE DO PROJETO 1 POIS UTILIZA EM SEU MODELO DE NEGOCIO CLASSES COMUNS (ex : PessoaJuridica,Endereco (Depende de estado, cidade que está no módulo 1)
Os 3 projetos usam os mesmos framework (Vraptor 3.3.1 +Hibernate 3.6.1) e queria aproveitar a camada de negocio de 1 em outro pra não ter que escrever a camada de domínio novamente , tem que replicar as classes e seus DAOs da vida . Aplicação distribuída está fora de questão por conta da infra e conhecimento da equipe .
Vi que no vraptor voce pode exportar um jar de todos os componentes anotados @Component que o spring faz a injeção de dependencia tranquilamente em outro até ai esta tudo ok .
Gerei o jar do projeto 1 com os componentes e coloquei na WEB-INF/lib do projeto 2 e 3 e coloquei no web.xml
<context-param>
<param-name>br.com.caelum.vraptor.packages</param-name>
<param-value>br.com.caelum.vraptor.converter.l10n,meuPacoteDoProjeto1</param-value>
</context-param>
Sobe tudo bunitinho e nos projeto 1 e 2 faz a injecao de dependencia tb corretamente …
Mas o estranho é que quando chamo um metodo da classe do Dao ele executa pois coloquei um log pra ter certeza que passa do inicio ao fim ele NÃO LANÇA EXCEPTION ou da erro algum mas tb não executa o sql correspondente ex : daoEstado.listAll()
É possível fazer isso que estou tentando ou to viajando e isso não existe ??
Acho que isso acontece porque o Hibernate não faz scan de entidades em jars. Pelo menos no JPA é assim, não sei se Hibernate puro há essa feature.
Hum … num tinha pensado nisso … voce teria alguma sugestão garcia ??
To precisando de uma luz nesse sentido pra não ter que ficar replicando classe de dominio e daos de acesso .
Em ultimo caso vou fazer um script ant que copia os .JAVA pros projetos dependentes . Não vejo muita solução nesse sentido .
Acho que em jars diferentes o scanning não funciona. Tente adicionar manualmente as entidades via persistence.xml do projeto real.
Ai rapaz num é que funcionou mesmo !!! Obrigado !!
Bom fica a solução para quem precisar quebrar em modulos 1 projeto e não pode partir pra uma aplicação EJB (que seria o ideal) :
Como não uso o arquivo persistence.xml por conta de ainda achar que a JPA falta um pouco pra chegar ao nivel do hibernate puro
adicionei no meu hibernate.cfg.xml dos dois projetos as tags da classes dependentes
<mapping class="meuProjeto1.models.Estado" />
<mapping class="meuProjeto1.models.Cidade" />
Mas quase certo que funcionaria com a JPA tb colocando a entrada de mapping na mão e vi tb que da pra colocar uma tag nesse arquivo pra talvez o scan automatico funcionar!!
Eu vejo 4 formas diferentes de resolver isso:
- Duplicar os jar, dentro da cada projeto.
- Se o 3 rodam no mesmo servidor, vc pode colocar eles na LIB do container e compartilhar 1 jar para todos.
- Colocar as classes em 1 projeto expondo serviços em web services e consumir nos outros 2.
- Usar EJB mesmo.
Cade um tem seus pros e contras…
Olá Srs vou dar miha opinião e dica.
Eu costumo criar os sistemas de forma componentizada, usando Maven, crio um projeto application para a regra de negocia, um projeto domain para models e daos, um projeto integration e commons, etc… e adiciono as dependencias de um em outro pelo pom.xml e funciona perfeitamente bem.
No meu caso usando JPA mesmo as classes de modelo anotadas no jar do Domain, no Spring eu incluo o nome do pacote no package-scan e ele funciona perfeitamente bem.
Desse modo se eu quiser criar um front end para web eu crio um modulo web e adiciono os modulos que o projeto web depende exempli, application, domain, commons etc…
e quando que buildar o war ja vai incluir os jars.
E se eu quiser criar um front end Swing, dá no mesmo, inclusive estou criando um agora com Spring 3, JPA e OpenSwing (Testando o Apache Derby).
Fica ai a dica, pois gosto de usar o maven por facilitar as dependencias.
fallow abraço
[quote=paulo1911]Olá Srs vou dar miha opinião e dica.
Eu costumo criar os sistemas de forma componentizada, usando Maven, crio um projeto application para a regra de negocia, um projeto domain para models e daos, um projeto integration e commons, etc… e adiciono as dependencias de um em outro pelo pom.xml e funciona perfeitamente bem.
No meu caso usando JPA mesmo as classes de modelo anotadas no jar do Domain, no Spring eu incluo o nome do pacote no package-scan e ele funciona perfeitamente bem.
Desse modo se eu quiser criar um front end para web eu crio um modulo web e adiciono os modulos que o projeto web depende exempli, application, domain, commons etc…
e quando que buildar o war ja vai incluir os jars.
E se eu quiser criar um front end Swing, dá no mesmo, inclusive estou criando um agora com Spring 3, JPA e OpenSwing (Testando o Apache Derby).
Fica ai a dica, pois gosto de usar o maven por facilitar as dependencias.
fallow abraço[/quote]
Então quando vc gerar um jar novo, o maven distribui para todas as aplicações?
Sim de forma versionada se eu quiser, basta vc especificar a dependencia no pom.xml da sua aplicação:
Ex.:
//As versões de dependencia são configuradas no POM.xml
<parent>
<artifactId>application</artifactId>
<groupId>nomeSuaApp</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>module-commons</artifactId> // se estiver implicito acompanha a versao do projeto declarada na tag version acima, mas pode especificar outra versao de dependencia
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>module-integration</artifactId>
</dependency>
Ex a Aplicação Swing usa o app-domain.0.0.1-SNAPSHOT.jar e a Aplicação Swing pode user a versao do domain app-domain.0.0.3-SNAPSHOT.jar e assim para todos os módulos…
Fica muito mais fácil de gerenciar isso.
Fica ai a minha dica.
Fallow Abraço
Muito bom mesmo paulo !
Vou acrescentar isso aqui no meu hall aqui do soluções.
T+