如何从Jar文件同目录读取外部Properties配置文件?
问题分析与解决方案
你的代码核心错误在于System.getProperty("app.properties")的用法:这个方法是用来读取JVM系统属性(如java.home、user.dir这类预定义属性),而非直接获取配置文件的路径,所以propPath的值会是null,导致无法找到配置文件。
要读取与Jar文件同目录的app.properties,可以通过以下两种可靠方式实现:
方法一:直接获取Jar文件所在目录(最可靠)
通过类的ProtectionDomain获取Jar文件的绝对路径,再推导其所在目录,无论从哪个路径启动Jar都能准确定位配置文件:
import java.io.File; import java.io.FileInputStream; import java.net.URI; import java.util.Properties; public class ReadProperties { private String message; private String userName; ReadProperties() { readProperties(); } private void readProperties() { try { // 获取当前类所在Jar文件的路径 URI jarUri = ReadProperties.class.getProtectionDomain().getCodeSource().getLocation().toURI(); File jarFile = new File(jarUri); // 获取Jar所在的目录 String jarDir = jarFile.getParentFile().getAbsolutePath(); // 拼接配置文件路径 String propPath = jarDir + File.separator + "app.properties"; FileInputStream in = new FileInputStream(propPath); Properties myProps = new Properties(); myProps.load(in); message = myProps.getProperty(Constants.MESSAGE); userName = myProps.getProperty(Constants.USERNAME); in.close(); // 记得关闭流 } catch (Exception e) { e.printStackTrace(); } } public String getMessage() { return message; } public String getUserName() { return userName; } }
方法二:利用当前工作目录(适合从Jar所在目录启动的场景)
如果确保用户总是从Jar所在目录执行java -jar xxx.jar命令,可以直接用user.dir系统属性获取当前工作目录:
private void readProperties() { try { // 获取当前工作目录(即启动Jar时所在的目录) String workDir = System.getProperty("user.dir"); String propPath = workDir + File.separator + "app.properties"; FileInputStream in = new FileInputStream(propPath); Properties myProps = new Properties(); myProps.load(in); message = myProps.getProperty(Constants.MESSAGE); userName = myProps.getProperty(Constants.USERNAME); in.close(); } catch (Exception e) { e.printStackTrace(); } }
额外注意事项
- 确保
app.properties文件确实放在Jar文件的同一目录下,文件名和代码中的一致(注意大小写,Linux系统区分大小写)。 - 建议添加文件存在性检查,避免
FileNotFoundException,比如在打开流前判断new File(propPath).exists()。
内容的提问来源于stack exchange,提问作者Viacheslav Kolisnichenko
相关产品推荐
相关产品推荐

