Vraptor 3 com projetos relacionados

Olá pessoal,

Tenho um projeto que usa o Vraptor 3 e ele começou a ficar muito grande então resolvemos quebrá-lo em 4 projetos (1 projeto core e 3 auxiliares), até aí tudo bem : )

Após isso, alterei o classpath do core para que usasse o que no eclipse ele chama de Projetos Relacionados e assim conseguiria usar as classes e bibliotecas que estão nos auxiliares. Isso funcionou bem e o compilador não mais reclamou dos imports e coisas do tipo.

O problema é que algumas de minhas classes anotadas com @Component foram para um dos projetos auxiliares e quando tento usá-las levo a exceção: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name xxxxx

que é justamente de uma classe que está em um projeto auxiliar e que está anotada como @component

PS - Todos os projetos tem a mesma estrutura de pacotes que é br.com.blumar.webservice e daí pra frente vai mudando de acordo com o projeto e com as classes envolvidas em cada projeto. O meu web.xml está assim:

<context-param> <param-name>br.com.caelum.vraptor.packages</param-name> <param-value>br.com.blumar.webservice</param-value> </context-param>

Alguma sugestão ???

Obrigado desde já…

Lucas

você gerou os jars desses projetos? como vc gerou esses jars?

Oi Lucas,

Então em geral eu uso o ant para isso e acredito que não terei problemas na hora que usar o ant o meu problema esta no ambiente de desenvolvimento. Uso aqui o eclipse com o plugin run-jetty-run ou o tomcat e nos 2 casos tenho o problema reportado…

Obrigado pela ajuda…

Abs

bom, se a classe anotada com @Component (do VRaptor) estiver abaixo do pacote br.com.blumar.webservice, se estiver dentro de um jar gerado pelo ant, e esse jar estiver em WEB-INF/lib (não basta só referenciar no eclipse) deveria funcionar sem problemas

Oi Lucas,

Obrigado pela resposta… mas meu problema aqui esta antes do build do ant. Estou tendo problemas em usar o @Component usando o plugin do eclipse run-jetty-run ou o plugin do tomcat. Ele não consegue achar a classe que está dentro de outro projeto para injetar as suas dependências. Fiz um teste aqui implementando um ComponentFactory para cada dependência e funcionou mas acho que essa solução não seria muito boa no meu caso.

Tem alguma configuração especial nesses plugins ? ou ainda no web.xml ?

Abs,
Lucas

dá ClassNotFoundException? ou o erro do spring?

no eclipse vc está referenciando os outros projetos, ou está com os jars dos outros projetos no WEB-INF/lib?

Oi Lucas,

Dá erro do spring… estou referenciando os outros projetos pelo eclipse -> build path -> configure build path -> projects

então, assim não vai funcionar mesmo… teria que estar o jar no WEB-INF/lib

tenta ir em botão direito no projeto >> Properties >> Java EE Module Dependencies e seleciona esses outros projetos. Daí o eclipse exporta os projetos junto com o projeto web, daí talvez funcione.

se vc não faz isso o eclipse só põe no classpath, mas não manda pro servidor

Opa,

Acabei de criar um tópico sobre o mesmo assunto, foi mal.

No meu caso, o jar está sendo exportado para a WEB-INF/lib, porém ele mesmo assim tá dando ClassNotFoundException.

se tá dando ClassNotFound deve ser algum problema na exportação do jar…

como vc está fazendo isso?

Nas propriedades do projeto, eu vou em Deployment Assembly e já adiciono o project que eu quero que seja exportado na forma de jar.

daí vc gera o jar e copia pro WEB-INF/lib do outro projeto?

será que o jar está sendo gerado com as classes? tenta abrir o jar (renomeie pra .zip e abra) e veja se as classes estão lá…

se nessa tela de deployment assembly tiver algo parecido com “Include directory entries”, é pra deixar isso selecionado

Lucas,

O eclipse já gera copia para a WEB-INF/lib automaticamente na hora do deploy, eu já tinha aberto o jar, e o .class se encontra lá. Eu até imaginei essa questão do include directories entries porque já tive problemas ao fazer isso manualmente, mas não tem nada do tipo. O estranho é que eu tenho outro projeto que não usa vraptor, e esse tipo de dependência funciona normalmente.

Vou postar o stacktrace aqui:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'stereotypedBeansRegistrar': Unsatisfied dependency expressed through constructor argument with index 0 of type [java.util.List]: : Cannot find class [br.com.apetiteweb.domain.dao.ClienteDAO] for bean with name 'clienteDAO' defined in URL [jar:file:/Applications/apache-tomcat-7.0.12/webapps/Cliente/WEB-INF/lib/core.jar!/br/com/apetiteweb/domain/dao/ClienteDAO.class]; nested exception is java.lang.ClassNotFoundException: br.com.apetiteweb.domain.dao.ClienteDAO; nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [br.com.apetiteweb.domain.dao.ClienteDAO] for bean with name 'clienteDAO' defined in URL [jar:file:/Applications/apache-tomcat-7.0.12/webapps/Cliente/WEB-INF/lib/core.jar!/br/com/apetiteweb/domain/dao/ClienteDAO.class]; nested exception is java.lang.ClassNotFoundException: br.com.apetiteweb.domain.dao.ClienteDAO
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:730)
	at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:196)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1003)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:907)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
	at org.springframework.context.event.AbstractApplicationEventMulticaster.getApplicationListeners(AbstractApplicationEventMulticaster.java:148)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:86)
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:303)
	at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:911)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:428)
	at br.com.caelum.vraptor.ioc.spring.SpringBasedContainer.start(SpringBasedContainer.java:106)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.start(SpringProvider.java:87)
	at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:110)
	at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:103)
	at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:273)
	at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:254)
	at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:372)
	at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:98)
	at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4562)
	at org.apache.catalina.core.StandardContext$2.call(StandardContext.java:5240)
	at org.apache.catalina.core.StandardContext$2.call(StandardContext.java:5235)
	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
	at java.util.concurrent.FutureTask.run(FutureTask.java:138)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:680)
Caused by: org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [br.com.apetiteweb.domain.dao.ClienteDAO] for bean with name 'clienteDAO' defined in URL [jar:file:/Applications/apache-tomcat-7.0.12/webapps/Cliente/WEB-INF/lib/core.jar!/br/com/apetiteweb/domain/dao/ClienteDAO.class]; nested exception is java.lang.ClassNotFoundException: br.com.apetiteweb.domain.dao.ClienteDAO
	at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1250)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:576)
	at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1319)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:315)
	at org.springframework.beans.factory.BeanFactoryUtils.beanNamesForTypeIncludingAncestors(BeanFactoryUtils.java:185)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:829)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:744)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:703)
	at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:795)
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:723)
	... 30 more
Caused by: java.lang.ClassNotFoundException: br.com.apetiteweb.domain.dao.ClienteDAO
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1676)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521)
	at org.springframework.util.ClassUtils.forName(ClassUtils.java:257)
	at org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:408)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1271)
	at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1242)
	... 39 more

vc tá com o pacote registrado no web.xml?

se sim, tenta tirar o pacote, e referenciar o ClienteDAO de alguma outra parte do sistema e ver se funciona normalmente

Desculpe a demora, é que viajei pro interior e to sem iinternet, pois bem, descobri uma coisa, parece que o jar que o eclipse tÁ gerando tÁ corrompido pq quando eu do um Java -jar ele da mensagem de corrupted jar. E quando gero o jar manualmente funciona. Não consegui achar de jeito nenhum o que pode estar acontecendo, tentei procurar se tinha algo como add directory entries nesse deployment assembly, mas n tem nada parecido, to sem saber o que fazer. Aposto que é algum manota minha mas…

Só pra constar, consegui resolver o problema. Não tinha nada a ver com o vraptor, era um problema no arquivo MANIFEST do core, por isso estava dando corrupt jar quando eu tentava rodar a partir da linha de comando. Agradeço a ajuda!