Maven项目读取属性文件异常:仅加载POM编码属性的问题排查
解决Properties文件加载异常仅含POM编码属性的问题
看起来你踩了properties-maven-plugin的一个常见误区——这个插件的write-project-properties目标并不是用来复制你手动编写的属性文件的,它的核心作用是把pom.xml中定义的所有项目属性写入到指定的输出文件中,这就导致你原本放在resources/property/db.properties的内容被插件覆盖,最终只剩下pom里的编码属性!下面分两种情况给你解决方案:
情况1:只想使用自己编写的db.properties文件
这种情况完全不需要这个插件,Maven默认会自动将src/main/resources下的所有文件复制到编译后的target/classes目录(也就是classpath根目录):
- 移除pom中配置的
properties-maven-plugin - 根据文件实际位置调整加载代码:
你的文件编译后位于classpath:/property/db.properties,可以用两种正确的加载方式:
或者更可靠的绝对路径写法(避免类加载器路径歧义):// 方式1:通过类加载器,从classpath根开始查找,不需要开头斜杠 this.getClass().getClassLoader().getResourceAsStream("property/db.properties");// 方式2:通过类对象,开头带斜杠表示从classpath根开始查找 this.getClass().getResourceAsStream("/property/db.properties");
情况2:确实需要用插件生成/合并属性文件
如果你的需求是把pom中定义的数据库配置(比如地址、账号)注入到db.properties中,推荐用Maven的资源过滤功能,而不是write-project-properties(它会完全覆盖你的文件):
- 在pom.xml的
<properties>节点声明需要的属性:<properties> <db.url>jdbc:mysql://localhost:3306/mydb</db.url> <db.username>root</db.username> <db.password>123456</db.password> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> - 在你的
db.properties中用占位符引用这些属性:url=${db.url} username=${db.username} password=${db.password} - 配置Maven资源插件开启过滤:
这样编译后,Maven会自动把占位符替换成pom中的实际值,同时保留你文件里的其他内容。<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <includes> <include>property/db.properties</include> </includes> </resource> </resources> </build>
验证步骤
执行mvn clean compile后,打开target/classes/property/db.properties查看内容,确认是你预期的结果。如果加载还是有问题,可以打印当前类加载器的根路径来排查:
System.out.println(this.getClass().getClassLoader().getResource("").getPath());
检查输出路径下是否存在property/db.properties文件,确认文件路径和加载代码匹配。
内容的提问来源于stack exchange,提问作者NuCradle
相关产品推荐
相关产品推荐

