Доставка jar с настройками файла .properties по умолчанию - PullRequest
0 голосов
/ 08 апреля 2010

Я хотел бы включить файл default.properties по умолчанию в мою библиотеку .jar.Идея состоит в том, чтобы позволить пользователю переопределить мои настройки по умолчанию, если он этого желает.

У меня проблемы с настройкой загрузчика классов, чтобы он хорошо играл с этой настройкой, я попытался взглянуть на популярные банки, такие как log4j, common- * и другие, и кажется, что никто не реализует эту идею.Я иду неправильным путем?

Вторая лучшая вещь - это жесткое кодирование значений и использование значения по умолчанию, если ключ .properties не найден, но этот звук ой как нехорошо.

Предложения?

Ответы [ 4 ]

1 голос
/ 08 апреля 2010

Я предпочитаю хранить значения по умолчанию и переопределения в отдельных файлах.

Допустим, у вас есть файл mysettings.properties. Я бы разделил это на две части. mysettings-default.properties и mysettings.properties.

Значение по умолчанию должно быть включено в файл jar и отправлено. Пользователь может переопределить значения по умолчанию, предоставив mysettings.properties в различных местах - например, classpath, или текущий рабочий каталог, или user.dir, или через пользовательское переопределение -Dsettings.path = / path / to / file. Таким образом, у вас есть разумные значения по умолчанию для ленивых и очень гибкий способ переопределения при необходимости.

Код довольно прост.

  1. Создать объект Properties, соответствующий mysettings-defaults
  2. Попробуйте загрузить mysettings из разных мест. Первый побеждает. Загрузите это в отдельный объект свойств.
  3. Объединить объект двух свойств. По сути, это карты, так что addAll работает. Просто будьте осторожны с заказом.

Вот и все! У вас есть настраиваемая система с разумными настройками по умолчанию.

0 голосов
/ 08 апреля 2010

вы можете прочитать файл конфигурации пользователя из classpath или из файловой системы.

подход файловой системы заключается в поиске файла конфигурации в заранее определенном месте (текущий каталог, / etc / или любой другой)и если не хватает, чтобы прочитать тот в банке.Вы даже можете включить команду для создания файла конфигурации по умолчанию (в виде файла).

Подход classpath сложнее, потому что ваше приложение не контролирует его полностью.идея заключается в том, что место, где пользователь должен найти свой файл конфигурации, должно быть ДО самого jar-файла в classpath.

вы можете использовать пользовательскую скрипку с classpath (что не очень хорошая идея) или отправьте банку с подходящим classpath (запись Class-Path в манифесте).Я не уверен, возможно ли это, потому что я ожидаю, что записи пути к классам в манифесте будут добавлены к пути к классам, а не предварительно добавлены.

0 голосов
/ 08 апреля 2010

Вы можете использовать ClassLoader для чтения файлов, которые есть у вас в classpath вашего фляги. Например, если у вас есть класс Test, и вы хотите прочитать файл, который находится в том же каталоге, что и ваши пакеты, вы можете использовать следующее:

Test.class.getClassLoader().getResourceAsStream("test_file.txt")

Вы можете проанализировать этот входной поток, используя ваши стандартные считыватели:

new BufferedReader(new InputStreamReader( Test.class.getClassLoader().getResourceAsStream("test_file.txt") ))

Наконец, если ваш файл находится в одном из ваших пакетов (com.test), вы указываете путь следующим образом:

 new BufferedReader(new InputStreamReader( Test.class.getClassLoader().getResourceAsStream("com/test/test_file.txt") ))
0 голосов
/ 08 апреля 2010

Я считаю ваш дизайн правильным и хорошим.log4j этого не делает, и я всегда ругаю их за то, что мне нужно вспомнить их синтаксис конфигурации и просто не могу пойти с некоторыми хорошими значениями по умолчанию (я знаю BasicConfigurator, но это слишком просто).

И я верю, что многие вебфреймворки объединяют свою конфигурацию по умолчанию в свои jar-файлы.

Какие у вас проблемы с загрузчиком классов?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...