Vraptor com Jetty 6

Pessoal,

Alguém já subiu vraptor com maven e jetty 6? Configurei minha aplicação e aparentemente o vraptor subiu direitinho, porém ele não inicia o scanner das anotações e nao acha meu controller:

[INFO] Starting jetty 6.1.26 ... 2012-08-06 19:23:04.733:INFO::jetty-6.1.26 2012-08-06 19:23:04.871:INFO::No Transaction manager found - if your webapp requires one, please configure one. 2012-08-06 19:23:05,125 [INFO] [BasicConfiguration] <Using class br.com.caelum.vraptor.ioc.spring.SpringProvider as Container Provider> 2012-08-06 19:23:05,142 [INFO] [DefaultSpringLocator] <No application context found> 2012-08-06 19:23:05,208 [INFO] [BasicConfiguration] <br.com.caelum.vraptor.scanning = null> 2012-08-06 19:23:05,208 [INFO] [WebAppBootstrapFactory] <Dynamic WebAppBootstrap found.> 2012-08-06 19:23:05,253 [INFO] [AnnotationConfigWebApplicationContext] <Refreshing Root WebApplicationContext: startup date [Mon Aug 06 19:23:05 BRT 2012]; root of context hierarchy> 2012-08-06 19:23:05,391 [INFO] [DefaultListableBeanFactory] <Overriding bean definition for bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor': replacing [Root bean: class [org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] with [Root bean: class [br.com.caelum.vraptor.ioc.spring.InjectionBeanPostProcessor]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null]> 2012-08-06 19:23:05,464 [INFO] [DefaultListableBeanFactory] <Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1ea88b6: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor#0,XStreamConverters.NullConverter,defaultRoutes,defaultAcceptHeaderToFormat,encodingHandlerFactory,defaultStaticContentHandler,defaultResourceNotFoundHandler,defaultMethodNotAllowedHandler,defaultInterceptorHandlerFactory,defaultTypeNameExtractor,defaultMultipartConfig,topologicalSortedInterceptorRegistry,cglibProxifier,defaultTypeFinder,nullProxyInitializer,defaultResourceTranslator,defaultRouter,objenesisInstanceCreator,noRoutesConfiguration,defaultDeserializers,pathAnnotationRoutesParser,javaEvaluator,defaultRestDefaults,defaultConverters,paranamerNameProvider,interceptorListPriorToExecutionExtractor,stereotypeHandler,converterHandler,interceptorStereotypeHandler,deserializesHandler,stereotypedBeansRegistrar,defaultSpringLocator,defaultFormatResolver,resourceLookupInterceptor,VRaptorDependencyProvider,emptyResult,replicatorOutjector,defaultResult,defaultRestHeadersHandler,defaultRefererResult,forwardToDefaultViewInterceptor,defaultLogicResult,instantiateInterceptor,XStreamXMLSerialization,outjectResult,defaultHttpResult,XStreamJSONSerialization,XStreamXMLDeserializer,VRaptorParameterNamesProvider,XStreamJSONPSerialization,HTMLSerialization,sessionFlashScope,executeMethodInterceptor,messageConverter,defaultStatus,exceptionHandlerInterceptor,defaultRepresentationResult,defaultPathResolver,XStreamConverters,defaultPageResult,iogiParametersProvider,jsonDeserializer,nullBeanValidator,defaultServletFileUploadCreator,jstlLocalization,commonsUploadMultipartInterceptor,defaultExceptionMapper,defaultMethodInfo,downloadInterceptor,applicationConfiguration,parametersInstantiatorInterceptor,deserializingInterceptor,VRaptorInstantiator,defaultValidator,defaultValidationViewsFactory,flashInterceptor,characterConverter,bigDecimalConverter,doubleConverter,primitiveFloatConverter,primitiveBooleanConverter,booleanConverter,bigIntegerConverter,primitiveShortConverter,byteConverter,longConverter,floatConverter,primitiveByteConverter,localeBasedDateConverter,localeBasedCalendarConverter,uploadedFileConverter,primitiveDoubleConverter,shortConverter,enumConverter,stringConverter,primitiveLongConverter,integerConverter,primitiveIntConverter,primitiveCharConverter,VRaptorRequestProvider,httpServletRequestProvider,httpServletResponseProvider,httpSessionProvider,enhancedRequestExecution,XStreamBuilderImpl,defaultInterceptorStack,org.springframework.aop.config.internalAutoProxyCreator]; root of factory hierarchy> 2012-08-06 19:23:05,556 [INFO] [DefaultConverters] <Registering bundled converters> 2012-08-06 19:23:05,583 [INFO] [LinkToHandler] <Registering linkTo component> 2012-08-06 19:23:05,644 [INFO] [VRaptor] <VRaptor 3.4.1 successfuly initialized> 2012-08-06 19:23:05.696:INFO::Started SelectChannelConnector@127.0.0.16:80 [INFO] Started Jetty Server

Controller:

[code]@Resource
public class HomeController {

private Result result;

public HomeController(Result result) {
    this.result = result;
}

@Get
@Path("/teste")
public void index() {
    System.out.println("chamou");

    result.forwardTo("index.vm");
}

}[/code]

pro vraptor funcionar vc precisa mudar o build das classes pro WEB-INF/classes

O /WEB-INF/classes/ está sendo gerado no pacote .war certinho. O maven não usa esse pacote pra rodar o jetty? Acho que não né? Bem vou fazer o teste como como você disse, posto os resultados amanhã!

[]s

qdo gera o war fica certinho… mas o plugin do jetty:run não faz isso.

Perfeito, Lucas. Funcionou certinho. Agora uma dúvida: tem como configurar esse caminho em que o vraptor vai procurar as classes? Só por curiosidade mesmo.

Pelo maven funcionou bacana como já tinha falado, mas fui rodar diretamente pelo jetty no servidor e…

2012-08-07 11:02:09.105:INFO::jetty-6.1.24 2012-08-07 11:02:11,673 [INFO] [BasicConfiguration] <Using class br.com.caelum.vraptor.ioc.spring.SpringProvider as Container Provider> 2012-08-07 11:02:14,350 [INFO] [DefaultSpringLocator] <No application context found> 2012-08-07 11:02:16,322 [INFO] [BasicConfiguration] <br.com.caelum.vraptor.scanning = null> 2012-08-07 11:02:16,322 [INFO] [WebAppBootstrapFactory] <Dynamic WebAppBootstrap found.> 2012-08-07 11:02:16.325:WARN::failed VRaptor: br.com.caelum.vraptor.scan.ScannerException: Could not determine WEB-INF/classes location 2012-08-07 11:02:16.326:WARN::Failed startup of context org.mortbay.jetty.webapp.WebAppContext@73aecc3a{/,file:/opt/webapps/cadastro-adm/cadastro-adm.war} br.com.caelum.vraptor.scan.ScannerException: Could not determine WEB-INF/classes location at br.com.caelum.vraptor.scan.WebBasedClasspathResolver.findWebInfClassesLocation(WebBasedClasspathResolver.java:58) at br.com.caelum.vraptor.scan.ScannotationComponentScanner.scan(ScannotationComponentScanner.java:50) at br.com.caelum.vraptor.scan.WebAppBootstrapFactory.scannerFor(WebAppBootstrapFactory.java:81) at br.com.caelum.vraptor.scan.WebAppBootstrapFactory.create(WebAppBootstrapFactory.java:51) at br.com.caelum.vraptor.ioc.spring.SpringProvider.start(SpringProvider.java:83) at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:108) at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:102) at org.mortbay.jetty.servlet.FilterHolder.doStart(FilterHolder.java:97) at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50) at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:662) at org.mortbay.jetty.servlet.Context.startContext(Context.java:140) at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250) at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517) at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467) at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50) at org.mortbay.jetty.handler.HandlerCollection.doStart(HandlerCollection.java:152) at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50) at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130) at org.mortbay.jetty.Server.doStart(Server.java:224) at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50) at org.mortbay.xml.XmlConfiguration.main(XmlConfiguration.java:985) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.mortbay.start.Main.invokeMain(Main.java:194) at org.mortbay.start.Main.start(Main.java:534) at org.mortbay.start.Main.start(Main.java:441) at org.mortbay.start.Main.main(Main.java:119)

Resolvido! Tive que mandar o jetty extrair o pacote .war, assim funcionou perfeitamente. Antes o meu XML de inicialização do jetty era:

<Item> <New class="org.mortbay.jetty.webapp.WebAppContext"> <Set name="contextPath">/</Set> <Set name="war">file:../meuprojeto.war</Set> <Set name="extractWAR">false</Set> </New> </Item>

Passou a ser:

<Item> <New class="org.mortbay.jetty.webapp.WebAppContext"> <Set name="contextPath">/</Set> <Set name="war">file:../meuprojeto.war</Set> <Set name="extractWAR">true</Set> </New> </Item>

Faz algum sentido só funcionar dessa forma?

não… esse caminho faz parte da específicação da API de Servlets, sempre deveria estar lá.