You need to enable JavaScript to run this app. Linux下java -jar运行打包应用抛出ConfigException$Missing异常排查
优惠活动
大模型
产品
解决方案
定价
更多

Linux下java -jar运行打包应用抛出ConfigException$Missing异常排查

问题根因

当前代码的配置读取逻辑和IDEA开发环境的目录结构强耦合,完全无法适配打包后的Jar运行场景:

  • IDEA启动应用时,默认工作目录为项目根路径,通过new File("src/main/resources/master.conf")可直接定位到磁盘上的真实配置文件,因此开发环境运行一切正常
  • 项目打包完成后,src/main/resources目录下的资源文件会被打入Jar包内部的类路径根目录,磁盘上不存在src/main/resources这层目录结构。此时通过磁盘文件的方式查找配置,要么直接触发文件不存在的错误,要么读到空内容,最终在调用config.getString()时抛出ConfigException$Missing异常——本质是加载到的配置对象为空,找不到对应的配置键。
修复方案
  • 替换原有磁盘文件读取逻辑,改为从类路径加载配置。Typesafe Config 原生支持类路径下的资源加载,可自动兼容开发环境、Jar包运行的场景,参考写法:
    // 自动从类路径定位并加载master.conf
    val config = ConfigFactory.load("master.conf")
    master = context.actorSelection(s"akka.tcp://masterSystem@${config.getString("akka.remote.netty.tcp.hostname")}:${config.getString("akka.remote.netty.tcp.port")}/user/Master")
    
  • 彻底解耦运行时路径与源码目录结构。src/main/resources只是源码阶段的资源存放目录,不属于运行时的固定路径,禁止在代码中硬编码引用该路径下的文件相对路径。
  • 如果后续需要支持不修改Jar包即可调整配置的场景,可以保留外部磁盘配置的读取逻辑,但需要将配置文件路径替换为:
    • 相对于Jar启动目录的外部配置路径(例如./conf/master.conf)
    • 用户手动指定的绝对配置文件路径
      不得继续指向源码目录下的路径。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 16:36:05