Spring AspectJ Load Time Weaving не работает с 5.3.3 и Tomcat 9.0.37

Я участвую в обзорной задаче старого проекта. Задача — обновить определенные библиотеки до более свежих версий. В этом проекте успешно использовалось 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, поэтому я вижу, что некоторые классы сплетены, но большинство тех классов, которые, как я ожидаю, сплетены, не являются.


person Sebastian Götz    schedule 11.02.2021    source источник
comment
Предполагая, что у вас есть какое-то управление зависимостями (maven, gradle), не могли бы вы также добавить зависимости от этого в свой вопрос? Еще одна интересная вещь — включить ведение журнала отладки для org.springframework.context.weaving и org.springframework.instrument. Наконец, проверьте, использует ли ваш tomcat javaagent для loadtimeweaving (если это так, вам также необходимо обновить его!).   -  person M. Deinum    schedule 11.02.2021
comment
Вы можете попробовать 5.2.0.M1, 5.2.0.M2 и т. д. до выпуска, чтобы увидеть, где он перестал работать, и, как уже упоминалось, включить вышеупомянутые регистраторы, чтобы получить больше информации об отличиях. И последнее: убедитесь, что в каком-то общем каталоге для Tomcat нет активных библиотек Spring (или агента!)   -  person M. Deinum    schedule 11.02.2021
comment
AspectJ 1.9.2+ должен поддерживать Java 11, текущая версия 1.9.6 поддерживает до Java 14. Кроме того, я не фанат Spring или Tomcat, у меня просто есть небольшой проект игровой площадки Spring с использованием Boot, на всякий случай. хотите ответить на вопросы Spring AOP или AspectJ LTW, используемые в Spring, такие как ваши. Однако обычно я настраиваю Spring с помощью аннотаций. Я могу посмотреть, не могли бы вы объединить свою проблему в MCVE и опубликовать ее на GitHub. Мне нравится иметь что-то воспроизводимое. Просто мини-приложение с одним аспектом или около того.   -  person kriegaex    schedule 12.02.2021
comment
Похоже, это известная проблема в системе отслеживания пружин.   -  person Sebastian Götz    schedule 12.02.2021


Ответы (1)


Это было вызвано регрессией в структуре Spring с версии 5.2.0.RELEASE. Вот проблема для этого.

person Sebastian Götz    schedule 22.02.2021