首页 > 解决方案 > java - 读取与jar文件相同目录中的配置文件

问题描述

我在 Intellij 中有一个简单的程序,我只是为了测试配置文件的读取文件路径。

我创建了一个简单的测试用例,我将使用计时器以 N 个间隔定期打印“Hello world”,其中 N 以毫秒为单位,N 是可配置的。

这是代码:

public void schedule() throws Exception {

       Properties props=new Properties();

        String path ="./config.properties";
        FileInputStream fis=new FileInputStream(path);
        BufferedReader in1=new BufferedReader(new InputStreamReader(fis));
       // InputStream in = getClass().getResourceAsStream("/config.properties");

        props.load(in1);
        in1.close();
        int value=Integer.parseInt(props.getProperty("value"));






        Timer t=new Timer();
        t.scheduleAtFixedRate(
                new TimerTask() {
                    @Override
                    public void run() {
                      // System.out.println("HELEOELE");

                        try {
                           // test.index();
                            System.out.println("hello ");
                        } catch (Exception e) {
                            e.printStackTrace();
                        }

                    }
                },
              0,
                value);





    }

我所做的是我在配置文件中将值设置为 N ,任何人都可以在不接触实际代码的情况下更改它。所以我编译了 jar 文件,并将 config.properties 和 jar 文件放在同一个文件夹或目录中。我希望能够更改使 N 可变,因此我不需要每次都一次又一次地重新编译 jar。

注意:配置属性文件是手动创建的,并放置在与 jar 相同的目录中。我正在命令提示符下执行 jar。

但是,当我尝试运行它时,它似乎无法识别文件路径。

"main" java.io.FileNotFoundException: .\config.properties (The system cannot find the file specified)

我研究了许多关于在 jar 文件之外读取配置文件的问题,但没有一个对我有用。我在这里做错了吗?

标签: java

解决方案


./config.properties是指向config.properties当前工作目录中文件的相对路径。

当前工作目录,除非由 更改,否则System.setProperty("user.dir", newPath)将是您启动当前处理您的代码的 JVM 的目录。

要让你的 jar 像现在这样工作,你有两种方法可用:

  1. 将文件复制config.properties到您正在执行的java目录
  2. 将您正在运行的目录更改为java包含config.properties

您还可以考虑让用户指定从何处获取属性文件:

String path = System.getProperty("propertiesLocation", "config.properties");

然后,您可以在调用 jar 时指定属性文件的位置:

java -jar /path/to/your.jar -DpropertiesLocation=/path/to/your.properties

config.properties或者像以前一样调用它,在当前工作目录的默认位置搜索属性。


推荐阅读