You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle Linux 8中无法运行Helidon 3.1.0 MP Java Jar包求助

Helidon 3.1.0 MP项目Oracle Linux 8启动异常解决

问题描述

基于Helidon 3.1.0的MicroProfile Java项目,打包后的Jar包在其他机器运行正常,但在Oracle Linux 8(Java 17.0.6)启动时抛出初始化异常,核心堆栈如下:

Exception in thread "main" java.lang.ExceptionInInitializerError
    at io.helidon.microprofile.cdi.ContainerInstanceHolder.fromBuildTimeInitializer(ContainerInstanceHolder.java:65)
    at io.helidon.microprofile.cdi.ContainerInstanceHolder.lambda$get$1(ContainerInstanceHolder.java:56)
    at io.helidon.microprofile.cdi.ContainerInstanceHolder.access(ContainerInstanceHolder.java:91)
    at io.helidon.microprofile.cdi.ContainerInstanceHolder.get(ContainerInstanceHolder.java:53)
    at io.helidon.microprofile.cdi.HelidonContainer.instance(HelidonContainer.java:48)
    at io.helidon.microprofile.server.Server$Builder.build(Server.java:190)
    at io.helidon.microprofile.server.Server.create(Server.java:83)
    at oracle.communications.sam.performance.KpiApplication.main(KpiApplication.java:61)
Caused by: org.jboss.weld.exceptions.DefinitionException: Exception List with 1 exceptions:
Exception 0 :
java.util.NoSuchElementException: Property IFS+x used in expression () { unset _mlshdbg;
 if [ "${MODULES_SILENT_SHELL_DEBUG:-0}" = '1' ]; then
 case "$-" in
 *v*x*)
 set +vx;
 _mlshdbg='vx'
 ;;
 *v*)
 set +v;
 _mlshdbg='v'
 ;;
 *x*)
 set +x;
 _mlshdbg='x'
 ;;
 *)
 _mlshdbg=''
 ;;
 esac;
 fi;
 unset _mlre _mlIFS;
 if [ -n "${IFS+x}" ]; then
 _mlIFS=$IFS;
 fi;
 IFS=' ';
 for _mlv in ${MODULES_RUN_QUARANTINE:-};
 do
 if [ "${_mlv}" = "${_mlv##*[!A-Za-z0-9_]}" -a "${_mlv}" = "${_mlv#[0-9]}" ]; then
 if [ -n "`eval 'echo ${'$_mlv'+x}'`" ]; then
 _mlre="${_mlre:-}${_mlv}_modquar='`eval 'echo ${'$_mlv'}'`' ";
 fi;
 _mlrv="MODULES_RUNENV_${_mlv}";
 _mlre="${_mlre:-}${_mlv}='`eval 'echo ${'$_mlrv':-}'`' ";
 fi;
 done;
 if [ -n "${_mlre:-}" ]; then
 eval `eval ${_mlre} /usr/bin/tclsh /usr/share/Modules/libexec/modulecmd.tcl bash '"$@"'`;
 else
 eval `/usr/bin/tclsh /usr/share/Modules/libexec/modulecmd.tcl bash "$@"`;
 fi;
 _mlstatus=$?;
 if [ -n "${_mlIFS+x}" ]; then
 IFS=$_mlIFS;
 else
 unset IFS;
 fi;
 unset _mlre _mlv _mlrv _mlIFS;
 if [ -n "${_mlshdbg:-}" ]; then
 set -$_mlshdbg;
 fi;
 unset _mlshdbg;
 return $_mlstatus
} does not exist
    at io.helidon.config.mp.MpConfigImpl.lambda$format$14(MpConfigImpl.java:421)
    ... 后续堆栈省略

异常原因

Oracle Linux 8默认启用了Modules环境管理工具,该工具会在shell环境中注入module函数(即堆栈中显示的shell脚本内容)。Helidon的MicroProfile配置模块会遍历所有环境变量并尝试解析其中的表达式,但它无法识别shell特有的${IFS+x}变量存在性检查语法,将其误判为配置表达式,从而抛出NoSuchElementException。

解决方案

方案1:启动前清除相关环境变量

启动Jar包前,先清除module函数对应的环境变量:

unset module && java -jar your-application.jar

方案2:禁用Helidon配置表达式解析

在项目的配置文件中关闭配置表达式解析功能,避免Helidon尝试解析环境变量中的shell语法:

  • 如果使用application.properties:
    helidon.config.mp.expressions.enabled=false
    
  • 如果使用application.yaml:
    helidon:
      config:
        mp:
          expressions:
            enabled: false
    

注意:此设置会禁用所有配置表达式,若项目中依赖${config.key}这类Helidon配置语法,需谨慎使用。

方案3:在干净环境中启动程序

使用env -i命令在隔离环境中启动Java程序,仅保留必要的环境变量:

env -i JAVA_HOME=$JAVA_HOME PATH=$PATH java -jar your-application.jar

内容的提问来源于stack exchange,提问作者apoorva vejarla

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 17:14:52