使用Maven Properties插件读取数据库配置遇加载异常
解决Maven打包后无法加载数据库属性文件的问题
我来帮你分析下问题所在,以及给出具体的修复方案:
问题根源
你当前的代码通过DatabaseSetting.class.getResource(dbPropertiesName).getPath()获取文件路径,再用FileInputStream读取——这种方式在IntelliJ里能正常运行,是因为此时属性文件是磁盘上的独立文件,路径是有效的。但Maven打包成Jar后,属性文件会被打包到Jar包内部,不再是磁盘上的单独文件,getPath()返回的是Jar内部的虚拟路径,FileInputStream根本找不到这个"文件",所以抛出IO异常。
修复方案:直接读取资源流
Jar包内的资源不能用文件系统的方式访问,正确的做法是直接通过getResourceAsStream()获取输入流来读取属性文件,不需要转换成File对象。
修改你的loadSettings方法如下:
public static DatabaseSetting loadSettings(String dbPropertiesName) { Properties dbProperties = new Properties(); // 直接从类加载器获取资源流 try (InputStream inputStream = DatabaseSetting.class.getResourceAsStream(dbPropertiesName)) { if (inputStream == null) { throw new RuntimeException("Cannot find database configuration file: " + dbPropertiesName); } dbProperties.load(inputStream); String host = dbProperties.getProperty("host"); String username = dbProperties.getProperty("username"); String password = dbProperties.getProperty("password"); String databaseName = dbProperties.getProperty("databaseName"); String table = dbProperties.getProperty("table"); return new DatabaseSetting(databaseName, host, username, password, table); } catch (IOException e) { throw new RuntimeException("Error loading database configuration file.", e); } }
关键修改点:
- 用
getResourceAsStream()替代getResource().getPath()+FileInputStream,直接获取Jar内资源的输入流 - 使用try-with-resources语法自动关闭输入流,避免资源泄漏
- 添加了资源不存在的判断,抛出更明确的异常信息
- 把原始异常
e传入RuntimeException,方便排查具体错误(比如文件内容格式问题)
额外注意事项
- 资源文件路径正确性:确保你传入的
dbPropertiesName是正确的类路径资源路径。如果你的database.properties在src/main/resources下,打包后会放在类根路径,所以应该传入"/database.properties"(注意开头的斜杠)。 - Maven插件的作用确认:你配置的
properties-maven-plugin是用来在Maven构建阶段读取属性文件到项目属性中(比如供其他插件或资源过滤使用),和代码运行时加载属性文件是两回事——如果你的代码不需要在构建阶段用这些属性,这个插件其实不影响运行时的资源加载,不过保留也没问题。
内容的提问来源于stack exchange,提问作者Kim
相关产品推荐
相关产品推荐

