【问题标题】:Spring AOP with GraalVM Native Image带有 GraalVM 原生镜像的 Spring AOP
【发布时间】:2021-05-10 16:07:25
【问题描述】:

有什么方法可以在 Spring Boot GraalVM native-image 中使用方面?我需要它来记录日志。图像运行时出现以下错误:

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 版本。

【问题讨论】:

  • 我将尝试将这篇文章通知 Andy Clement,因为他既是 AspectJ 的维护者,也是使 Spring 与 GraalVM 兼容的幕后策划者之一。同时,如果您可以在没有任何代码或构建信息的情况下提供超出上下文的堆栈跟踪,那就太好了。请提供MCVE,最好是 GitHub 上的 Maven 项目,同时说明您如何运行哪个 GraalVM 版本等。

标签: spring-boot aop aspect graalvm


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2020-09-09
    • 2021-01-07
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多