Смутно о местоположении файла свойств Java
У меня есть простой Java-проект со структурой:
package com.abc:
a.java
b.java
c.properties
У меня есть параметры конфигурации базы данных, настроенные в файле c.properties.
Внутри a.java и b.java я загружаю файлы свойств, используя:
Properties p = new Properties();
InputStream in = this.getClass().getResourceAsStream("c.properties");
p.load(in);
Это прекрасно работает. Но главный вопрос заключается в том, что, как только я подготовлю исполняемый банку, экспортируя этот код, файл свойств также будет упакован в файл jar. Если кто-то хочет изменить файл свойств для другой конфигурации базы данных, как он может это сделать?
Должен ли я хранить файл свойств в некотором фиксированном месте на локальном компьютере. например "C:/". Затем дайте банку вместе с файлом свойств другому человеку. Затем ему нужно скопировать файл свойств внутри C:/location?
Также еще один вопрос, как я могу сделать это местоположение общим для окон и Linux-машин?
Ответы
Ответ 1
Типичным способом обработки этого является загрузка базовых свойств из встроенного файла и возможность пользователям приложения указать дополнительный файл с переопределениями. Некоторые псевдокоды:
Properties p = new Properties();
InputStream in = this.getClass().getResourceAsStream("c.properties");
p.load(in);
String externalFileName = System.getProperty("app.properties");
InputStream fin = new FileInputStream(new File(externalFileName));
p.load(fin);
Ваша программа будет вызвана примерно так:
java -jar app.jar -Dapp.properties="/path/to/custom/app.properties"
Ответ 2
Сначала сохраните свойства по умолчанию в вашем файле свойств, который будет упакован в банку. Когда приложение запускает попытку чтения одного и того же файла свойств по умолчанию из некоторого местоположения по умолчанию в файловой системе, предпочитайте домашнюю папку пользователя, которую вы можете получить с помощью System.getProperty("user.home");
. Если файл существует в файловой системе, загрузите его, если он не существует, загрузите файл упакованных свойств и напишите копию в файловую систему.
Итак, если ваше имя файла свойств myprops.properties
, изначально только ваш файл jar будет содержать его. Когда приложение запустится, он проверяет наличие файла /home/xyz/myprops.properties
. Так как это не так, он прочитает файл упакованных свойств и напишет копию в файл /home/xyz/myprops.properties
. В следующий раз он будет читать от /home/xyz/myprops.properties
.
Ответ 3
Почему бы не передать местоположение файла свойств в качестве аргумента командной строки (после флага)? если он отсутствует, то используйте файл по умолчанию в файле jar.
Ответ 4
Вы загружаете файл свойств из пути к классу. Я бы предложил что-то вроде этого:
Местоположение свойств