Недавно я попытался определить и прочитать глобальные свойства на сервере приложений. Преимущество такого свойства, настроенного на сервере приложений, — оно может использоваться всеми веб-приложениями, развернутыми на этом сервере. Каждое развернутое приложение может читать одно и то же свойство, которое настраивается только один раз в одном месте. Я попытался сделать системное свойство с другим системным свойством в части значения. На сервере приложений JBoss / WildFly вы можете, например, определить системное свойство в файле конфигурации standalone.xml . Я установил свойство exporting.service.config.file .
|
1
2
3
|
<system-properties> <property name="exporting.service.config.file" value="${jboss.server.config.dir}\exporting\exporting-service.properties"/></system-properties> |
jboss.server.config.dir указывает на каталог базовой конфигурации в JBoss. Это свойство устанавливается автоматически JBoss. В этом примере у нас есть так называемая Variable Interpolation . Определение из Википедии : «Переменная интерполяция (также подстановка переменных или расширение переменных) — это процесс вычисления строкового литерала, содержащего один или несколько заполнителей, с получением результата, в котором заполнители заменяются соответствующими значениями». Другим примером для заполнителей ${...} в значении свойства может быть следующая конфигурация:
|
1
2
3
|
application.name=My Appapplication.version=2.0application.title=${application.name} ${application.version} |
Теперь, когда мы пытаемся получить системное свойство из первого примера с помощью Java System.getProperty(...)
|
1
2
|
String globalConfigFile = System.getProperty("exporting.service.config.file"); |
мы получим значение ${jboss.server.config.dir}\exporting\exporting service.properties . Заполнитель ${jboss.server.config.dir} не разрешен. Во втором примере такие же проблемы.
Какой самый простой способ прочитать свойства с переменной интерполяцией? Ну, есть Spring Framework с PlaceholderConfigurerSupport и так далее. Но иметь такую большую структуру, как зависимость, непросто. Есть ли легкая библиотека? Да, конечно — Конфигурация Apache Commons . Конфигурация Apache Commons предоставляет специальные префиксные имена для свойств, чтобы оценить их в определенном контексте. Есть например:
-
sys:этот префикс помечает переменную как системное свойство. Конфигурация Commons будет искать системное свойство с заданным именем и заменять переменную на ее значение. -
const:префикс указывает, что переменная должна интерпретироваться как постоянное поле члена класса. Имя переменной должно быть полностью определенным именем класса. -
env:префикс ссылается на свойства среды ОС.
Некоторые примеры из документации:
|
1
2
3
|
user.file = ${sys:user.home}/settings.xmlaction.key = ${const:java.awt.event.KeyEvent.VK_CANCEL}java.home = ${env:JAVA_HOME} |
Теперь я могу добавить необходимую зависимость в свой проект Maven
|
1
2
3
4
5
|
<dependency> <groupId>commons-configuration</groupId> <artifactId>commons-configuration</artifactId> <version>1.10</version></dependency> |
установить префикс sys: before jboss.server.config.dir
|
1
2
3
|
<system-properties> <property name="exporting.service.config.file" value="${sys:jboss.server.config.dir}\exporting\exporting-service.properties"/></system-properties> |
и напишите следующий код
|
1
2
3
4
5
6
7
|
import org.apache.commons.configuration.SystemConfiguration;...SystemConfiguration systemConfiguration = new SystemConfiguration();String globalConfigFile = systemConfiguration.getString("exporting.service.config.file");... |
String globalConfigFile на моем ноутбуке имеет значение C:\Development\Servers\jboss-as-7.1.1.Final\standalone\configuration\exporting\exporting-service.properties . Префикс sys: помечает переменную как системное свойство. Конфигурация Commons будет искать системное свойство с заданным именем и заменять переменную на ее значение. Полный код:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
import org.apache.commons.configuration.ConfigurationException;import org.apache.commons.configuration.PropertiesConfiguration;import org.apache.commons.configuration.SystemConfiguration;...PropertiesConfiguration propertiesConfiguration = new PropertiesConfiguration();SystemConfiguration systemConfiguration = new SystemConfiguration();String globalConfigFile = systemConfiguration.getString("exporting.service.config.file");if (globalConfigFile != null) { try { propertiesConfiguration.setDelimiterParsingDisabled(true); propertiesConfiguration.load(globalConfigFile); } catch (ConfigurationException e) { LOG.log(Level.INFO, "Cannot read global properties"); } } |
Любое отдельное свойство может быть прочитано, например, как
|
1
2
3
4
5
6
|
propertiesConfiguration.getString("someKey")propertiesConfiguration.getString("someKey", someDefaultValue)propertiesConfiguration.getBoolean("someKey")propertiesConfiguration.getBoolean("someKey", someDefaultValue)propertiesConfiguration.getInteger("someKey")propertiesConfiguration.getInteger("someKey", someDefaultValue) |
usw. Это все. Дайте мне знать, если вы знаете еще один простой способ чтения свойств с переменной интерполяцией.
| Ссылка: | Способ прочитать свойства с переменной интерполяцией от нашего партнера JCG Олега Вараксина в блоге Мысли о разработке программного обеспечения . |