gpt4 book ai didi

spring - 使用 Tomcat 和 Spring 配置 AspectJ LTW 时遇到问题

转载 作者:行者123 更新时间:2023-12-04 12:15:10 26 4
gpt4 key购买 nike

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

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

tomcat/webapps/API/ROOT/WEB-INF/lib/aspectjweaver.jar
tomcat/webapps/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 并且我看到加载器正在被使用。我错了吗?我是否需要在任何地方使用 spring-agent.jar,在 tomcat/lib 或我的 tomcat 类路径中?我需要在 tomcat/lib 中使用 aspectjweaver.jar 吗?我还缺少什么?任何帮助将不胜感激,因为我已经为此努力了近两天。

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

最佳答案

原来是我用来启动Tomcat的Eclipse插件。我们整个团队都依赖它,从不从本地机器上的命令行启动 Tomcat。它对破坏 LTW 的类加载器做了一些事情。当我最终从命令行启动 Tomcat 时,一切正常。作为记录,如果您在 server.xml 中指定 TomcatInstrumentableClassLoader,则不需要 -javaagent:path/to/spring-agent.jar。

关于spring - 使用 Tomcat 和 Spring 配置 AspectJ LTW 时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1348843/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com