spring aspectj加载时间编织不适用于5.3.3和tomcat 9.0.37

3xiyfsfu  于 2021-07-23  发布在  Java
关注(0)|答案(1)|浏览(239)

我参与了一个旧项目的审查任务。任务是将某些库更新到更新的版本。该项目成功地使用了spring(4.3.14.release)加载时编织,以及jdk8下的aspectj(1.9.0)和tomcat8.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分支中的代码被执行。在这里,对类加载器的引用为null,导致aspectj被禁用。
通过传递 <context:load-time-weaver aspectj-weaving="on"/> 最终没有效果。aspectj已设置为活动状态,并且已加载定义,但未检测到应用任何方面定义(meta inf/aop.xml)。由于aspectj功能或包结构到目前为止没有任何改变,所以在spring中一定有什么改变,从4.3.14到5.3.3)或aspectj(1.9.0到1.9.4)。快速查看github repo显示了我唯一的一个重要变化。但在调试时,更改前使用的类加载器也是空的。
有没有人在让aspectj以这种方式工作时遇到过类似的问题?在我看来,问题在于检测类路径上的aop.xml文件。
编辑:我用jdk和tomcat版本的不同组合做了更多的研究。问题与这两者无关。在逐版本升级spring时,我发现它一直工作到5.1.20.release。从5.2.0开始发布我的问题。同时,我激活了aspectj日志,所以我可以看到一些类是编织的,但是我希望编织的大多数类不是。

gwbalxhn

gwbalxhn1#

这是由于spring框架自5.2.0.0发布以来的一次回归造成的。这就是问题所在。

相关问题