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:
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…
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
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 ?
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
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
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!