如何在WildFly 35中设置默认ExpressionFactoryImpl为Glassfish实现
解决方案:强制WildFly使用Glassfish Expressly ExpressionFactory
WildFly 35基于Jakarta EE 10,默认EL实现为Glassfish Expressly,但Activiti自带的JUEL会通过类加载优先级覆盖容器实现。以下是几种可靠的修复方式:
方法1:通过部署结构配置强制依赖容器EL模块
在你的EAR/WAR包的META-INF/jboss-deployment-structure.xml中添加如下配置,明确指定优先使用WildFly提供的Glassfish Expressly模块,同时排除Activiti的JUEL模块:
<jboss-deployment-structure> <deployment> <dependencies> <module name="org.glassfish.expressly" export="true" /> </dependencies> <exclusions> <module name="org.activiti.core.el.juel" /> </exclusions> </deployment> </jboss-deployment-structure>
方法2:排除Activiti自带的JUEL依赖
通过构建工具(Maven/Gradle)移除Activiti依赖中的JUEL模块,让应用直接使用容器提供的EL实现:
Maven配置示例
<dependency> <groupId>org.activiti</groupId> <artifactId>activiti-engine</artifactId> <version>你的Activiti版本号</version> <exclusions> <exclusion> <groupId>org.activiti.core</groupId> <artifactId>activiti-el</artifactId> </exclusion> </exclusions> </dependency>
Gradle配置示例
implementation('org.activiti:activiti-engine:你的Activiti版本号') { exclude group: 'org.activiti.core', module: 'activiti-el' }
方法3:通过系统属性全局指定ExpressionFactory
在WildFly启动参数中添加系统属性,强制全局使用Glassfish的ExpressionFactory实现:
-Djakarta.el.ExpressionFactory=org.glassfish.expressly.ExpressionFactoryImpl
你可以将该参数添加到WildFly的bin/standalone.conf(Linux)或bin/standalone.conf.bat(Windows)文件中,确保每次启动都生效。
验证生效
配置完成后重启WildFly,触发原异常场景,检查堆栈信息是否回到Glassfish Expressly的调用链(如出现org.glassfish.expressly.parser.AstValue.getTarget),即可确认配置生效。
内容的提问来源于stack exchange,提问作者Tobsi
相关产品推荐
相关产品推荐

