Проблемы с настройкой AspectJ LTW с Tomcat и Spring - PullRequest
7 голосов
/ 28 августа 2009

У меня возникли проблемы с переплетением времени загрузки для работы с 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:

кот / WebApps / API / ROOT / WEB-INF / Lib / aspectjweaver.jar кот / WebApps / API / ROOT / WEB-INF / Библиотека / весна-aspects.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-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-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 ]

6 голосов
/ 08 сентября 2009

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

0 голосов
/ 04 сентября 2009

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

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

...