Spring 3, JPA 2.0 - load -timer-weaving

Olá,

Estou utilizando Spring 3 e JPA 2 e EclipseLink como provider, porém estou tendo problema quando configuro no meu xml o load-timer-weaving

	<context:load-time-weaver/>

A exception que ocorre é a seguinte:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0' defined in ServletContext resource [/WEB-INF/jpa-servlet.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in ServletContext resource [/WEB-INF/jpa-servlet.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loadTimeWeaver': Initialization of bean failed; nested exception is java.lang.IllegalStateException: ClassLoader [org.apache.catalina.loader.WebappClassLoader] does NOT provide an 'addTransformer(ClassFileTransformer)' method. Specify a custom LoadTimeWeaver or start your Java virtual machine with Spring's agent: -javaagent:org.springframework.instrument.jar

Ai diz que eu devo especificar um LoadTimerWeaver personalizado ou inicializar minha JVM com um agente do Spring. Porém não sei o que isso quer dizer, pelo que pesquisei, entendi esse waving é quando se aplica aspectos no sistema e o load-timer-weaver é quando isso acontece em tempo de carga da classe na JVM. É isso mesmo?

Se alguem souber algo agradeço!

Não passei por isso…mas quando você faz o load time weaving é necessário que o class loader faça umas mágicas na sua classe… e pelo que parece o seu class loader não faz isso… e voce precisa utilizar um agent para turbinar o jvm como citado no erro:

-javaagent:org.springframework.instrument.jar

Como parâmetro para a máquina virtual

Você está usando qual servidor? Tomcat?

Sim estou usando o Tomcat.

Quando fiz com JPA 1, Spring 2.5 e Hibernate como provider isso tbm não acontecia.

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/aop.html

Nesse capitulo tá falando sobre o agent…

Dá uma olhada lá…

Parece que no Tomcat… tem que usar o Agent mesmo…

Ou então configurar o Tomcat… para utilizar esse TomcatInstrumentableClassLoader (posso estar falando bobagem aqui)

Pois é:

Estou Utiliazando o Tomcat 6.0.18, vou tentar seguir esses passos pra ver o que vai dar.

Uma dúvida:

O trecho abaixo de ser colocado no arquivo context.xml do Tomcat? E o que devo indicar neste path e neste docBase?

<Context path="/myWebApp" docBase="/my/webApp/location">
    <Loader
        loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/>
</Context>

Não sei em detalhes como fazer…

Mas o trecho deve ser colocado no context.xml…

agora… o docBase não sei o que é…

Onde voce conseguiu esse código?

Você pode criar um context.xml em /META-INF/context.xml dentro da sua app também para nao ter que mecher no tomcat

Copie esse arquivo para o lib do tomcat tb org.springframework.instrument.tomcat.jar

O negócio do docbase acho que é assim

<Context path="/exemplo" docBase=“webapps/exemplo”

Isso serve para indicar onde a sua aplicação está… para fazer o deploy em um lugar fora do lugar padrão…

No seu caso… se a sua app tiver dentro de webappps… acho que o trecho acima vai resolver…

Então, peguei este codigo na documentação do spring, naquele link que vc postou.

No meu caso estou utilizando o tomcat no eclipse para rodar o projeto, na pasta webapps do tomcat nao tem o meu projeto. Neste caso eu devo passar o endereço de onde está o projeto no workspace?

[quote]docBase

The Document Base (also known as the Context Root) directory for this web application, or the pathname to the web application archive file (if this web application is being executed directly from the WAR file). You may specify an absolute pathname for this directory or WAR file, or a pathname that is relative to the appBase directory of the owning Host.

The value of this field must not be set when the Context is configured using a META-INF/context.xml file as it will be inferred by the automatic deployment process.[/quote]

Na documentação do Tomcat diz que quando o context.xml estiver dentro do diretório META-INF eu não preciso usar este docBase pois ele será deduzido automaticamente.

Porém parece que ele não está reconhecendo este contex

Voce tá usando o WTP??

Esse WTP sempre dá problema com o tomcat…

Na view servers…

clica duas vezes no servidor do tomcat…

Vai aparecer uma tela de configuracao…

Tem uma opcao para copiar a aplicacao para a pasta webapps do tomcat… ao invés de usar ela no eclipse (eu nao sei exatamente onde é… pq to sem essa configuracao de tomcat aqui… mas tem essa opcao)…


Acho que usando o WTP já é criado um context.xml na sua app… acho que dá pra vc configurar por ele também…

É realmente necessário que eu use este load-timer-weaving?

Pelo que eu li na documentacao… para voce usar com o tomcat parece q sim…

Tenta usar o JBoss… que parece que com ele nao tem essas configuracoes…

Assim voce ve funcionando…

Depois vc tenta fazer o tomcat funcionar…

Esse load-time-weaving… só é necessário se vc for usar algum tipo de AOP (Aspecto)

Consegui arrumar, modifiquei os arquivos server.xml e context.xml ficam dentro Diretório Server que o Eclipse cria quando um servidor é configurado asssim eu não precisei modificar os arquivos do diretorio do Tomcat, pois esses arquivos são criados especificamente para as configurações do projeto que está sendo rodado no meu workspace.

Agora apareceram outras exceções, vou tentar arrumar aqui, qualquer coisa volto a postar!

Obrigada pela ajuda!!

realmente eu estou utilizando!

Cris como vc conseguiu resolver esse problema? estou com o msm problema!

vlw,

Você já tentou isto?

-javaagent:/path/to/jar/spring-agent.jar

ref: http://www.springbyexample.org/examples/aspectj-ltw.html

flws