使用Tomcat和Spring配置AspectJ LTW时出现问题

时间:2009-08-28 19:18:17

标签: spring transactions aop aspectj load-time-weaving

我在Tomcat 6 webapp中使用Spring进行加载时编织时遇到了一些问题。我只想将它用于事务(因此自我调用遵循事务注释,而不是AOP代理)。似乎正在加载织布工,但我的注释类实际上并没有被编织。当我单步执行代码时,我在SQL日志中看不到任何事务边界,正如我在常规AOP代理配置中看到的那样。这是我的设置:

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

我有tom-tomcat-weaver.jar tomcat / lib目录,以及我的Tomcat类路径上的以下jar:

的Tomcat / web应用/ API / ROOT / WEB-INF / LIB / aspectjweaver.jar 的Tomcat / web应用/ API / ROOT / WEB-INF / LIB / spring-aspects.jar中

这是在bean配置文件中,其中定义了带注释的服务类:

<tx:annotation-driven transaction-manager="txManager" mode="aspectj"/>

在我的上下文中的许多其他bean配置文件之一:

<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" />

我希望MethodTimer使用常规AOP代理,而不是LTW - LTW只应用于@Transactional注释。如下所述:http://static.springsource.org/spring/docs/2.5.x/reference/aop.html#aop-aj-configure。如果我注释掉<aop:aspectj-autoproxy>元素,我不会得到任何我看到的编织信息日志消息。说到这里,他们在这里;你可以看到方面正在被加载,但实际上没有任何东西被编织:

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()')

从日志中可以看出,我没有自己的aop.xml文件,我使用spring-aspects.jar中的默认文件,如下所示:

<aspectj>

    <!--
    <weaver options="-showWeaveInfo"/>
    -->

    <aspects>
        <aspect name="org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect"/>
        <aspect name="org.springframework.transaction.aspectj.AnnotationTransactionAspect"/>
    </aspects>

</aspectj>

我不需要用-javaagent:/path/to/spring-agent.jar启动Tomcat,对吗?因为我在server.xml中指定了正确的ClassLoader并且看到加载器被使用了。我错了吗?我需要在tomcat / lib或tomcat类路径中的任何地方使用spring-agent.jar吗?在tomcat / lib中我需要aspectjweaver.jar吗?我还缺少什么?任何帮助都会非常感激,因为我现在已经和它搏斗了近两天。

编辑:我省略了一个(也许是非常重要的)细节 - 我正在Eclipse中开发并使用Sysdeo Tomcat插件来启动Tomcat。将尝试从命令行启动Tomcat,看看是否有所作为......

2 个答案:

答案 0 :(得分:6)

事实证明,这是我用来启动Tomcat的Eclipse插件。我们的整个团队已经变得依赖它,从不从我们本地机器上的命令行启动Tomcat。它与破坏LTW的类加载器有关。当我终于从命令行启动Tomcat时,一切都运行得很好。对于记录,如果在server.xml中指定TomcatInstrumentableClassLoader,则不需要-javaagent:path / to / spring-agent.jar。

答案 1 :(得分:0)

是的,我相信你需要spring-agent.jar作为javaagent。 另外,我不知道是不是这种情况,但是MethodTimer是一个方面,还是你试图横切的?如果它是一个方面,那么它需要@Aspect注释。

您可能还想使用自己的自定义META-INF / aop.xml文件并指定