Проблемы с настройкой AspectJ LTW с Tomcat и Spring

У меня возникли некоторые проблемы с настройкой времени загрузки для работы с Spring в моем веб-приложении Tomcat 6. Я хочу использовать его только для транзакций (чтобы при самопризыве учитывались аннотации транзакций, чего нельзя сказать при проксировании 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>

У меня есть каталог tomcat / lib spring-tomcat-weaver.jar и следующие файлы jar на моем пути к классам Tomcat:

tomcat / webapps / API / ROOT / WEB-INF / lib / aspectjweaver.jar tomcat / webapps / API / ROOT / WEB-INF / lib / spring-aspect.jar

Это в файле конфигурации бина, где определены аннотированные классы обслуживания:

<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: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-aspect.jar, который выглядит следующим образом:

<aspectj>

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

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

</aspectj>

Мне не нужно начинать Tomcat с -javaagent:/path/to/spring-agent.jar, правильный? Потому что я указал правильный ClassLoader в server.xml и вижу, что загрузчик привык. Я ошибаюсь по этому поводу? Нужно ли где-нибудь spring-agent.jar, либо в tomcat / lib, либо в моем classpath tomcat? Нужен ли aspectjweaver.jar в tomcat / lib? Что еще мне не хватает? Любая помощь будет принята с благодарностью, так как я борюсь с этим уже почти два дня.

Изменить: еще одну (возможно, очень важную) деталь, которую я пропустил - я разрабатываю в Eclipse и использую плагин Sysdeo Tomcat для запуска Tomcat. Попытка запуска Tomcat из командной строки и посмотреть, если это имеет значение...

2 ответа

Оказалось, что это был плагин Eclipse, который я использовал для запуска Tomcat. Вся наша команда стала полагаться на него, так и не запустив Tomcat из командной строки на наших локальных машинах. Это делает что-то с загрузчиком классов, который сломал LTW. Когда я наконец запустил Tomcat из командной строки, все работало отлично. Для записи вам НЕ нужен -javaagent:path/to/spring-agent.jar, если вы указали TomcatInstrumentableClassLoader в server.xml.

Да, я верю, что вам нужен spring-agent.jar в качестве javaagent. Кроме того, я не знаю, так ли это, но является ли MethodTimer аспектом или это то, что вы пытаетесь пересечь? Если это аспект, то ему нужна аннотация @Aspect.

Вы также можете использовать свой собственный файл META-INF/aop.xml и указать

Другие вопросы по тегам