Я участвую в обзорной задаче старого проекта. Задача — обновить определенные библиотеки до более свежих версий. В этом проекте успешно использовалось load-time-weaving с spring (4.3.14.RELEASE) вместе с AspectJ (1.9.0) и Tomcat 8.0.20 под JDK 8 с. Теперь весна должна быть обновлена до самой последней версии (на данный момент 5.3.3), а также версия Tomcat должна быть поднята до последней версии (на данный момент нацелена на 9.0.37). Сервер должен работать под управлением JDK 11. После обновления библиотек мы обнаружили, что AspectJ больше не работает. Поэтому я начал отлаживать это. AspectJ активируется из конфигурации XML следующим образом:
<context:load-time-weaver />
При отладке запуска контейнера наткнулся на этот кусок кода в org.springframework.context.config.LoadTimeWeaverBeanDefinitionParser
:
protected boolean isAspectJWeavingEnabled(String value, ParserContext parserContext) {
if ("on".equals(value)) {
return true;
}
else if ("off".equals(value)) {
return false;
}
else {
// Determine default...
ClassLoader cl = parserContext.getReaderContext().getBeanClassLoader();
return (cl != null && cl.getResource(AspectJWeavingEnabler.ASPECTJ_AOP_XML_RESOURCE) != null);
}
}
Поскольку мы не предоставляем никаких атрибутов тегу XML, AspectJ находится в режиме автоматического обнаружения, что приводит к выполнению кода в ветке else. Там ссылка на загрузчик классов имеет значение null, что приводит к отключению AspectJ.
Попытка явно активировать AspectJ путем передачи <context:load-time-weaver aspectj-weaving="on"/>
в итоге не дала результата. AspectJ был активирован, и определения были загружены, но ни одно из определений Aspect (META-INF/aop.xml) не было обнаружено примененным. Поскольку мы до сих пор ничего не изменили с помощью функциональности или структуры пакета AspectJ, что-то должно было измениться весной с 4.3.14 на 5.3.3) или AspectJ (с 1.9.0 на 1.9.4). Быстрый взгляд в репо GitHub показал только один мой значительные изменения < /а>. Но при отладке загрузчик классов, использовавшийся до изменения, также был нулевым.
У кого-нибудь были подобные проблемы с тем, чтобы заставить AspectJ работать таким образом? Мне кажется, что проблема заключается в обнаружении файлов aop.xml в пути к классам.
EDIT: я провел дополнительные исследования, используя различные комбинации версий JDK и Tomcat. Проблема не связана с этими двумя. При обновлении весенней версии за версией я обнаружил, что до 5.1.20.RELEASE она работала нормально. Начиная с 5.2.0.RELEASE у меня начинаются проблемы. Между тем, у меня активно ведение журнала AspectJ, поэтому я вижу, что некоторые классы сплетены, но большинство тех классов, которые, как я ожидаю, сплетены, не являются.
org.springframework.context.weaving
иorg.springframework.instrument
. Наконец, проверьте, использует ли ваш tomcat javaagent для loadtimeweaving (если это так, вам также необходимо обновить его!). - person M. Deinum   schedule 11.02.20215.2.0.M1
,5.2.0.M2
и т. д. до выпуска, чтобы увидеть, где он перестал работать, и, как уже упоминалось, включить вышеупомянутые регистраторы, чтобы получить больше информации об отличиях. И последнее: убедитесь, что в каком-то общем каталоге для Tomcat нет активных библиотек Spring (или агента!) - person M. Deinum   schedule 11.02.2021