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) - 用户手动指定的绝对配置文件路径
不得继续指向源码目录下的路径。
- 相对于Jar启动目录的外部配置路径(例如
内容的提问来源于stack exchange,提问作者jakehou_cn
相关产品推荐
相关产品推荐

