微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spring AspectJ 加载时间编织不适用于 5.3.3 和 Tomcat 9.0.37

如何解决Spring AspectJ 加载时间编织不适用于 5.3.3 和 Tomcat 9.0.37

我参与了一个旧项目的审查任务。任务是将某些库更新到更新的版本。这个项目在JDK 8下成功地使用了load-time-weaving with spring(4.3.14.RELEASE)和AspectJ(1.9.0)和Tomcat 8.0.20。现在 spring 将更新到最新版本(目前为 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 分支中的代码被执行。对类加载器的引用为空,导致 AspectJ 被禁用。

通过传递 <context:load-time-weaver aspectj-weaving="on"/> 来显式激活 AspectJ 的尝试最终没有任何效果。 AspectJ 被设置为活动状态并加载了定义,但没有检测到应用任何 Aspect 定义 (meta-inf/aop.xml)。由于到目前为止我们没有通过 AspectJ 功能或包结构进行任何更改,因此在 spring 从 4.3.14 到 5.3.3) 或 AspectJ(1.9.0 到 1.9.4)中一定发生了一些变化。 GitHub 存储库中的快速视图显示了我唯一一个重要的 change。但是调试这个,改之前用的classloader也是null。

有没有人遇到过类似的问题让 AspectJ 以这种方式工作?在我看来,问题在于检测类路径上的 aop.xml 文件

编辑: 我使用 JDK 和 Tomcat 版本的不同组合进行了更多研究。问题与这两个无关。在逐个版本升级 spring 版本时,我发现它运行良好,直到 5.1.20.RELEASE。从 5.2.0.RELEASE 开始,我的问题开始了。同时,我的 AspectJ 日志记录处于活动状态,因此我可以看到有些类是编织的,但我希望编织的大多数类都没有。

解决方法

这是由 Spring 框架自 5.2.0.RELEASE 以来的回归引起的。 Here 是问题所在。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。