Spring 3, JPA 2.0 - load -timer-weaving

28 respostas
cris.t

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!

28 Respostas

rogelgarcia

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?

cris.t

Sim estou usando o Tomcat.

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

rogelgarcia

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á…

rogelgarcia

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)

cris.t

Pois é:

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

cris.t

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>
rogelgarcia

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?

rogelgarcia

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

rogelgarcia

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…

cris.t

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?

cris.t

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.

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

rogelgarcia

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…

cris.t

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

rogelgarcia

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…

rogelgarcia

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

cris.t

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!!

cris.t

realmente eu estou utilizando!

kadu.m.lino

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

vlw,

fantomas

Você já tentou isto?

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

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

flws

kadu.m.lino

sim, joguei no meu aplicationContext.xml, mas não deu certo

eu consegui colocando o - javaagent: … pelo eclipse… mas o certo deveria ser pelo tomcat…

kadu.m.lino

onde eu deveria colocar o "-javaagent:/path/to/jar/spring-agent.jar "??

cris.t

Se vc estiver utilizando tomcat como eu estava, o que fiz foi adicionar dentro do arquivo context.xml do tomcat as seguintes linhas:

&lt;Context path="nome da aplicação"&gt;
 &lt;Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/&gt;
&lt;/Context&gt;

e dentro da pasta lib do tomcat adicionar o jar org.springframework.instrument.tomcat.

kadu.m.lino
<Context path="/nomeDoProjeto	" docBase="/home/ricardolino/java/workspace">
    <Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/>
</Context>

coloquei desse jeito! e ainda add a lib no tomcat… mas msm assim ele insiste em não funcionar!

cris.t

Acho que esse doc base não é necessário se vc já estiver com o server configurado no seu workspace, tenta dar um clean no tomcat e no projeto pra ver.

kadu.m.lino

Vc disse que alterou o server.xml e o context.xml sem ser do tomcat…
onde ficam esses arquivos e quais foram as alterações?

cris.t

Quando vc configura o tomcat no eclipse aparece no workspace um diretório chamado Servers, lá dentro terão estes arquivos. As alterações foram as postadas acima e colocar o jar dentro do diretório lib onde o tomcat estiver instalado.

kadu.m.lino

Vlw Cris.t
Consegui… estava alterando o context.xml errado…
depois de ter alterado o context da pasta Severs do tomcat deu um outro erro

mas foi só colocar o jar spring-tomcat-weaver que funcionou!

vlw pelo ajuda!

abrass

cris.t

Por nada!

Criado 5 de março de 2010
Ultima resposta 21 de set. de 2012
Respostas 28
Participantes 4