Problemas para configurar AspectJ LTW con Tomcat y Spring
transactions aop (2)
Resultó que era el plugin de Eclipse que estaba usando para iniciar Tomcat. Todo nuestro equipo se ha vuelto dependiente de él, nunca ha iniciado Tomcat desde la línea de comandos en nuestras máquinas locales. Hace algo con el cargador de clases que rompió LTW. Cuando finalmente conseguí que Tomcat comenzara desde la línea de comandos, todo funcionó perfectamente. Para el registro, NO necesita -javaagent: ruta / a / spring-agent.jar si especifica TomcatInstrumentableClassLoader en server.xml.
Estoy teniendo problemas para hacer que el tejido en tiempo de carga funcione con Spring en mi aplicación web Tomcat 6. Solo quiero usarlo para transacciones (para que la auto invocación respete las anotaciones transaccionales, lo que no ocurre con el proxy AOP). Parece que el tejedor se está cargando, pero mis clases anotadas no se tejen realmente. Cuando paso por mi código, no veo ningún límite de transacción en los registros de SQL, como estaba viendo con la configuración de proxy de AOP normal. Aquí está mi configuración:
En server.xml:
<Context path="/api" allowLinking="true" reloadable="false" docBase="/usr/local/apache-tomcat-6.0.18/webapps/API/ROOT" workDir="/usr/local/apache-tomcat-6.0.18/webapps/API/ROOT/work">
<Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/>
</Context>
Tengo el directorio de tomcat / lib de spring-tomcat-weaver.jar y los siguientes archivos jar en mi classpath de Tomcat:
tomcat / webapps / API / ROOT / WEB-INF / lib / aspectjweaver.jar tomcat / webapps / API / ROOT / WEB-INF / lib / spring-aspects.jar
Esto se encuentra en el archivo de configuración de beans donde se definen las clases de servicio anotadas:
<tx:annotation-driven transaction-manager="txManager" mode="aspectj"/>
En uno de los muchos otros archivos de configuración de beans en mi contexto:
<aop:aspectj-autoproxy>
<aop:include name="methodTimer"/>
</aop:aspectj-autoproxy>
<context:load-time-weaver aspectj-weaving="on"/>
<context:annotation-config />
<bean name="methodTimer" class="tv.current.web.aop.MethodTimer" />
Quiero que MethodTimer use un proxy AOP regular, no LTW - LTW solo debería aplicarse a las anotaciones @Transactional. Como se describe aquí: http://static.springsource.org/spring/docs/2.5.x/reference/aop.html#aop-aj-configure . Si hago un comentario sobre el elemento <aop:aspectj-autoproxy>
, no recibo ninguno de los mensajes de registro de información de tejido que veo de otra manera. Hablando de eso, aquí están; puedes ver que los aspectos se están cargando pero nada se está tejiendo en realidad:
Aug 28, 2009 6:34:42 PM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring root WebApplicationContext
[TomcatInstrumentableClassLoader@34fe7e0e] info AspectJ Weaver Version 1.6.5 built on Thursday Jun 18, 2009 at 03:42:32 GMT
[TomcatInstrumentableClassLoader@34fe7e0e] info register classloader org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader@34fe7e0e
[TomcatInstrumentableClassLoader@34fe7e0e] info using configuration file:/usr/local/apache-tomcat-6.0.18/webapps/API/ROOT/WEB-INF/lib/spring-aspects.jar!/META-INF/aop.xml
[TomcatInstrumentableClassLoader@34fe7e0e] warning ignoring duplicate definition: jar:file:/usr/local/apache-tomcat-6.0.18/webapps/API/ROOT/WEB-INF/lib/spring-aspects.jar!/META-INF/aop.xml
[TomcatInstrumentableClassLoader@34fe7e0e] info register aspect org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect
[TomcatInstrumentableClassLoader@34fe7e0e] info register aspect org.springframework.transaction.aspectj.AnnotationTransactionAspect
[TomcatInstrumentableClassLoader@34fe7e0e] info processing reweavable type org.springframework.beans.factory.aspectj.AbstractInterfaceDrivenDependencyInjectionAspect$ConfigurableDeserializationSupport: org/springframework/beans/factory/aspectj/AbstractInterfaceDrivenDependencyInjectionAspect.aj
[TomcatInstrumentableClassLoader@34fe7e0e] info successfully verified type org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect exists. Originates from org/springframework/beans/factory/aspectj/D:/projects/spring/spring/aspectj/src/org/springframework/beans/factory/aspectj/AnnotationBeanConfigurerAspect.aj
[TomcatInstrumentableClassLoader@34fe7e0e] info successfully verified type org.springframework.beans.factory.aspectj.AbstractInterfaceDrivenDependencyInjectionAspect exists. Originates from org/springframework/beans/factory/aspectj/D:/projects/spring/spring/aspectj/src/org/springframework/beans/factory/aspectj/AbstractInterfaceDrivenDependencyInjectionAspect.aj
[TomcatInstrumentableClassLoader@34fe7e0e] weaveinfo Type ''org.springframework.beans.factory.aspectj.AbstractInterfaceDrivenDependencyInjectionAspect$ConfigurableDeserializationSupport'' (AbstractInterfaceDrivenDependencyInjectionAspect.aj) has intertyped method from ''org.springframework.beans.factory.aspectj.AbstractInterfaceDrivenDependencyInjectionAspect'' (D:/projects/spring/spring/aspectj/src/org/springframework/beans/factory/aspectj/AbstractInterfaceDrivenDependencyInjectionAspect.aj:''java.lang.Object org.springframework.beans.factory.aspectj.AbstractInterfaceDrivenDependencyInjectionAspect$ConfigurableDeserializationSupport.readResolve()'')
Como puede ver en los registros, no tengo mi propio archivo aop.xml, estoy usando el predeterminado en spring-aspects.jar, que es el siguiente:
<aspectj>
<!--
<weaver options="-showWeaveInfo"/>
-->
<aspects>
<aspect name="org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect"/>
<aspect name="org.springframework.transaction.aspectj.AnnotationTransactionAspect"/>
</aspects>
</aspectj>
No necesito iniciar Tomcat con -javaagent:/path/to/spring-agent.jar
, ¿correcto? Porque especifiqué el ClassLoader correcto en server.xml y veo que el cargador se está utilizando. ¿Estoy equivocado sobre esto? ¿Necesito spring-agent.jar en cualquier lugar, ya sea en tomcat / lib o en mi ruta de clases tomcat? ¿Necesito aspectjweaver.jar en tomcat / lib? ¿Qué más me estoy perdiendo? Cualquier ayuda sería muy apreciada ya que he estado luchando con esto durante casi dos días.
Editar: Un detalle más (quizás muy importante) que he omitido: estoy desarrollando en Eclipse y utilizando el complemento Sysdeo Tomcat para iniciar Tomcat. Intentará iniciar Tomcat desde la línea de comandos y ver si eso hace la diferencia ...
Sí, creo que necesitas el agente de primavera.jar como javaagent. Además, no sé si este es el caso, pero ¿es MethodTimer un aspecto, o es lo que intentas cruzar? Si se trata de un aspecto, necesita la anotación @Aspect.
También puede usar su propio archivo META-INF / aop.xml personalizado y especificar el