Смущен расположением файла свойств Java - PullRequest
24 голосов
/ 05 февраля 2012

У меня есть простой проект 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 путем экспорта этого кода, файл свойств также будет упакован в файл jar.Если кто-то хочет изменить файл свойств для другой конфигурации базы данных, как он может это сделать?Нужно ли хранить файл свойств в каком-то фиксированном месте на локальном компьютере.например, "c: /".Затем передайте банку вместе с файлом свойств другому лицу.Затем ему нужно скопировать файл свойств в C: / location?Также еще один вопрос, как я могу сделать это местоположение универсальным для Windows и Linux?

Ответы [ 4 ]

27 голосов
/ 05 февраля 2012

Типичный способ справиться с этим - загрузить базовые свойства из встроенного файла и позволить пользователям приложения указать дополнительный файл с переопределениями.Какой-то псевдокод:

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"
3 голосов
/ 05 февраля 2012

Сначала сохраните свойства по умолчанию в вашем файле свойств, который упакован в банку.Когда приложение запускается, попробуйте прочитать файл свойств с тем же именем из некоторого местоположения по умолчанию в файловой системе, предпочтительно домашнюю папку пользователя, которую можно получить по System.getProperty("user.home");.Если файл существует в файловой системе, загрузите его, если он не существует, загрузите упакованный файл свойств и запишите копию в файловую систему.

Так что, если имя файла свойств - myprops.properties, первоначально только вашеJAR-файл будет содержать его.Когда приложение запускается, оно проверит, существует ли файл /home/xyz/myprops.properties.Поскольку это не так, он будет читать файл упакованных свойств и записывать копию в файл /home/xyz/myprops.properties.Со следующего раза он будет читать с /home/xyz/myprops.properties.

2 голосов
/ 05 февраля 2012

Почему бы не передать местоположение файла свойств в качестве аргумента командной строки (после флага)?если его нет, используйте файл по умолчанию в файле jar.

0 голосов
/ 05 февраля 2012

Вы загружаете файл свойств из пути к классам.Я бы предложил что-то вроде этого:

Расположение объектов

...