集成Kogito的Quarkus微服务Native模式启动失败:MVEL编译不支持
Kogito集成Quarkus Native模式启动失败:MVEL编译不支持
错误日志
2024-06-06 07:16:59,136 ERROR [io.qua.run.Application] (main) Failed to start application (with profile [dev]): java.lang.RuntimeException: Failed to start quarkus at io.quarkus.runner.ApplicationImpl.doStart(Unknown Source) at io.quarkus.runtime.Application.start(Application.java:101) at io.quarkus.runtime.ApplicationLifecycleManager.run(ApplicationLifecycleManager.java:111) at io.quarkus.runtime.Quarkus.run(Quarkus.java:71) at io.quarkus.runtime.Quarkus.run(Quarkus.java:44) at io.quarkus.runtime.Quarkus.run(Quarkus.java:124) at io.quarkus.runner.GeneratedMain.main(Unknown Source) Caused by: java.lang.UnsupportedOperationException: MVEL compilation is not supported in native image at org.jbpm.workflow.instance.impl.MVELProcessHelper.lambda$static$1(MVELProcessHelper.java:40) at org.jbpm.workflow.instance.impl.MVELProcessHelper.compileExpression(MVELProcessHelper.java:57) at org.jbpm.workflow.core.impl.OutputExpressionAssignment.<init>(OutputExpressionAssignment.java:42) at org.jbpm.workflow.core.impl.DataAssociation.buildInterpretedAssignment(DataAssociation.java:56) at java.base@17.0.11/java.util.Arrays$ArrayList.forEach(Arrays.java:4204) at org.jbpm.workflow.core.impl.DataAssociation.<init>(DataAssociation.java:46) at com.epm.ticket.workflow.TicketWorkflowProcess.process(TicketWorkflowProcess.java:1116) at org.kie.kogito.process.impl.AbstractProcess.get(AbstractProcess.java:250) at org.kogito.process.impl.AbstractProcess.activate(AbstractProcess.java:192) at com.epm.ticket.workflow.TicketWorkflowProcess.<init>(TicketWorkflowProcess.java:23) at com.epm.ticket.workflow.TicketWorkflowProcess_Bean.doCreate(Unknown Source) at com.epm.ticket.workflow.TicketWorkflowProcess_Bean.create(Unknown Source) at com.epm.ticket.workflow.TicketWorkflowProcess_Bean.create(Unknown Source) at io.quarkus.arc.impl.AbstractSharedContext.createInstanceHandle(AbstractSharedContext.java:113) at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:37) at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:34) at io.quarkus.arc.impl.LazyValue.get(LazyValue.java:26) at io.quarkus.arc.impl.ComputingCache.computeIfAbsent(ComputingCache.java:69) at io.quarkus.arc.impl.AbstractSharedContext.get(AbstractSharedContext.java:34) at io.quarkus.arc.impl.ClientProxies.getApplicationScopedDelegate(ClientProxies.java:21) at com.epm.ticket.workflow.TicketWorkflowProcess_ClientProxy.arc$delegate(Unknown Source) at com.epm.ticket.workflow.TicketWorkflowProcess_ClientProxy.arc_contextualInstance(Unknown Source) at com.epm.ticket.workflow.TicketWorkflowProcess_Observer_Synthetic_1e642942b2e0ecd00ec189c20062bdec9100a46d.notify(Unknown Source) at io.quarkus.arc.impl.EventImpl$Notifier.notifyObservers(EventImpl.java:346) at io.quarkus.arc.impl.EventImpl$Notifier.notify(EventImpl.java:328) at io.quarkus.arc.impl.EventImpl.fire(EventImpl.java:82) at io.quarkus.arc.runtime.ArcRecorder.fireLifecycleEvent(ArcRecorder.java:155) at io.quarkus.arc.runtime.ArcRecorder.handleLifecycleEvents(ArcRecorder.java:106) at io.quarkus.deployment.steps.LifecycleEventsBuildStep$startupEvent1144526294.deploy_0(Unknown Source) at io.quarkus.deployment.steps.LifecycleEventsBuildStep$startupEvent1144526294.deploy(Unknown Source) ... 7 more
环境配置
- Quarkus版本:3.2.11.Final-redhat-00001
- Kogito版本:2.44.0.Alpha
- Java版本:17
问题原因及解决方案
核心原因
MVEL表达式的运行时编译在GraalVM Native Image环境中不被支持——Native镜像构建时会提前完成所有代码的编译和静态分析,运行时无法动态生成新的字节码,而你的流程中使用了需要运行时编译的MVEL表达式。
解决办法
切换到FEEL表达式
Kogito推荐使用FEEL作为默认表达式语言,它在Native镜像构建阶段会被提前编译,完全兼容Native模式。将流程定义中的所有MVEL表达式替换为FEEL语法即可。启用MVEL预编译
如果必须保留MVEL表达式,在application.properties中添加配置:kogito.processes.mvel.precompile=true,确保Kogito在构建Native镜像时提前编译所有MVEL表达式,避免运行时编译操作。排查动态表达式
检查TicketWorkflowProcess.java第1116行对应的流程逻辑,确认是否存在动态生成的MVEL表达式——这类表达式无法被预编译,必须替换为静态可分析的表达式或FEEL语法。验证版本兼容性
当前使用的Quarkus(3.2.x)和Kogito(2.44.0.Alpha)版本组合可能存在兼容性问题,建议升级Kogito到与Quarkus 3.2.x匹配的稳定版本(如Kogito 1.44.x系列),Alpha版本可能存在Native模式的未修复Bug。
内容的提问来源于stack exchange,提问作者Flo
相关产品推荐
相关产品推荐

