带有 GraalVM 原生镜像的 Spring AOP

问题描述

有没有办法在 Spring Boot GraalVM 原生镜像中使用切面?我需要它用于记录目的。我在运行图像时遇到以下错误

Caused by: org.aspectj.weaver.BCException: AspectJ internal error

        at org.aspectj.weaver.reflect.ReflectionWorld.makeAnnotationFinderIfAny(ReflectionWorld.java:132) ~[na:na]
        at org.aspectj.weaver.reflect.ReflectionWorld.<init>(ReflectionWorld.java:97) ~[na:na]
        at org.aspectj.weaver.reflect.ReflectionWorld.getReflectionWorldFor(ReflectionWorld.java:51) ~[na:na]
        at org.aspectj.weaver.tools.pointcutParser.setClassLoader(pointcutParser.java:222) ~[na:na]
        at org.aspectj.weaver.tools.pointcutParser.<init>(pointcutParser.java:208) ~[na:na]
        at org.aspectj.weaver.tools.pointcutParser.getpointcutParserSupportingSpecifiedPrimitivesAndUsingSpecifiedClassLoaderForResolution(pointcutParser.java:170) ~[na:na]
        at org.springframework.aop.aspectj.AspectJExpressionpointcut.initializepointcutParser(AspectJExpressionpointcut.java:242) ~[na:na]
        at org.springframework.aop.aspectj.AspectJExpressionpointcut.buildpointcutExpression(AspectJExpressionpointcut.java:221) ~[na:na]
        at org.springframework.aop.aspectj.AspectJExpressionpointcut.obtainpointcutExpression(AspectJExpressionpointcut.java:198) ~[na:na]
        at org.springframework.aop.aspectj.AspectJExpressionpointcut.getClassFilter(AspectJExpressionpointcut.java:177) ~[na:na]
        at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:226) ~[na:na]
        at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:289) ~[na:na]
        at org.springframework.aop.support.AopUtils.findAdvisorsThatCanApply(AopUtils.java:321) ~[na:na]
        at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoproxyCreator.findAdvisorsThatCanApply(AbstractAdvisorAutoproxyCreator.java:128) ~[com.fon.footballfantasy.FootballFantasyApplication:5.3.1]
        at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoproxyCreator.findEligibleAdvisors(AbstractAdvisorAutoproxyCreator.java:97) ~[com.fon.footballfantasy.FootballFantasyApplication:5.3.1]
        at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoproxyCreator.getAdvicesAndAdvisorsForBean(AbstractAdvisorAutoproxyCreator.java:78) ~[com.fon.footballfantasy.FootballFantasyApplication:5.3.1]
        at org.springframework.aop.framework.autoproxy.AbstractAutoproxyCreator.wrapIfNecessary(AbstractAutoproxyCreator.java:337) ~[com.fon.footballfantasy.FootballFantasyApplication:5.3.1]
        at org.springframework.aop.framework.autoproxy.AbstractAutoproxyCreator.postProcessAfterInitialization(AbstractAutoproxyCreator.java:289) ~[com.fon.footballfantasy.FootballFantasyApplication:5.3.1]
        at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapablebeanfactory.java:444) ~[na:na]
        at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.initializeBean(AbstractAutowireCapablebeanfactory.java:1792) ~[na:na]
        at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.doCreateBean(AbstractAutowireCapablebeanfactory.java:609) ~[na:na]
        ... 37 common frames omitted

我想问题出在 Spring AOP 运行时编织上,但如何解决

编辑:
谢谢你的回答! 很抱歉没有提前提供更多信息。
示例项目:https://github.com/programer20/graalvm-demo
我按照官方文档入门步骤https://repo.spring.io/milestone/org/springframework/experimental/spring-graalvm-native-docs/0.8.3/spring-graalvm-native-docs-0.8.3.zip!/reference/index.html#_getting_started
创建了原生镜像 我尝试了 0.8.3 和 0.8.5 版本。

解决方法

我认为您对这个问题的看法是正确的。如果您在进行构建时编织,那完全没问题,因为修改后的字节码将被送入 GraalVM native-image 进行分析并包含在图像中。如果进行加载时编织,我相信它可以工作,但最近还没有确认您是否在构建本机图像时使用加载时编织(通过设置 java 选项以包含 aspectjweaver 代理),这些类将在加载时被编织,并且编织的形式将包含在图像中。它永远无法在图像运行时真正工作,因为不再有类的概念,并且类不能被动态定义。

所以是的,因为Spring AOP可以做的比较晚,所以配置解决后,可能会出现问题。查看 spring native 项目以获得将您的 Spring 项目构建为原生映像的最新支持,但据我所知,我们现在没有用于 Spring AOP 的示例。我鼓励您针对该项目提出问题,包括展示您的特定问题非常宝贵的示例项目。您还没有提到您现在如何创建本机图像,这可能会影响我的建议。我认为在流程中稍早进行一些分析/编织可以使其发挥作用,但尚未进入该领域。