You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 16:09:26