Я часто использую стандартные файлы свойств Java для настройки моих приложений Groovy. Одна из особенностей, которую я упустил, - это возможность использовать переменные как часть значения свойства, чтобы они могли динамически расширяться во время использования. Я думал, что могу предоставить эту функциональность, используя следующую схему:Использование Groovy для расширения переменных в свойствах Java
- Используйте специальный формат для аннотирования свойств, которые следует развернуть. Я решил включить такие шаблоны в двойные восклицательные знаки (!!). Эти значения свойств по существу являются шаблонами, которые должны быть расширены с помощью локальных переменных
- Перед использованием свойств в приложении используйте метод groovy 'evaluation' для расширения переменных приложения в шаблоне
- Повторно присвойте исходный ключ свойства новое значение перед использованием
Так что, если у меня есть файл свойств config.properties со свойствами, как:
version=2.3
local_lib=!!${env['GROOVY_HOME']}/${configProps.getProperty('version')}/lib!!
local_lib свойство будет расширено от переменной GROOVY_HOME и версии значение свойства.
В моем приложении, я закодированы это следующим образом:
//Load the environment variables and configuration file
env=System.getenv()
configFile=new File('config.properties')
configProps= new Properties()
configProps.load(configFile.newDataInputStream())
//Replace configuration property values with their expanded equivalent
configProps.each{
//if a property value is a template we evaluate it
if (it.value.startsWith('!!')){
valTemplate=it.value.replace('!!','"')
it.value=evaluate(valTemplate)
}
}
//then we use the expanded property values
Это похоже на работу. Когда я
println configProps
Я вижу, что значение расширяется и не нулевой
Однако метод GetProperty для расширенного свойства возвращает нуль.
assert configProps.getProperty('local_lib')=='C:\\DEVTOOLS\\groovy-2.4.7/2.3/lib'
| | |
| null false
[local_lib:C:\DEVTOOLS\groovy-2.4.7/2.3/lib, version:2.3]
В чем причина этого несоответствия? Я бы ожидал вернуть значение, показанное на карте свойств.
Кстати, я избегаю использования Properties.getProperty() и Properties.setProperty() в Groovy именно по этой причине.Я предпочитаю использовать синтаксис и семантику карты при работе с объектами свойств. – BalRog
О, действительно, @BalRog, принуждающий к String, решает проблему. Спасибо! –