Java读取jar包内application.properties报错原因及解决方案咨询
错误含义
Error: Unable to load the configuration from the URL file:/root/file:/opt/pcc/lib/smp-asnef.jar!/BOOT-INF/classes!/application.properties
该错误的核心原因是:JAR包是归档压缩文件,内部的资源没有独立的操作系统文件系统路径,你用File类直接读取JAR包内的资源的操作本身就不被支持。路径中的!是JAR资源专属分隔符,用来标识!后面的内容是JAR包内部的路径,这类路径只能通过流的方式读取,不能被File类识别。
同时路径出现了重复的file:协议前缀拼接错误,是调用URL.getFile()方法后直接把完整URL字符串传给File构造方法导致的,进一步导致路径失效。
程序实际查找的路径
程序当前错误拼接的查找路径为:file:/root/file:/opt/pcc/lib/smp-asnef.jar!/BOOT-INF/classes!/application.properties
该路径完全不符合操作系统文件路径规范,所以无法找到目标文件。
解决方案
根据你是否需要修改配置文件,可选择对应方案:
- 仅读取配置不需要修改
直接通过类加载器获取资源流读取内容,不要转成File对象:try (InputStream is = this.getClass().getClassLoader().getResourceAsStream("application.properties")) { Properties prop = new Properties(); prop.load(is); // 后续处理配置 } catch (IOException e) { // 处理资源加载异常 } - 需要修改配置内容
JAR包内部文件默认是只读状态,运行时无法直接修改,建议调整配置加载逻辑:- 将可修改的配置文件放到JAR包外部固定路径,比如
/opt/pcc/config/application.properties,程序优先读取外部路径配置,找不到时再读取JAR包内部的默认配置 - 如果你使用的是Spring Boot项目,可以直接复用框架的外部配置优先级规则,启动时添加启动参数
--spring.config.location=/opt/pcc/config/application.properties即可直接覆盖内部配置 - 如需动态修改配置,建议使用配置中心、本地缓存文件或者数据库存储可变更的配置项,不要尝试直接修改JAR包内的文件
- 将可修改的配置文件放到JAR包外部固定路径,比如
内容的提问来源于stack exchange,提问作者Igor_M
相关产品推荐
相关产品推荐

