Обновление: изначально предполагалось, что эта проблема связана с поведением Apache Commons Config.Я обновил вопрос и название, чтобы сузить фокус вопроса.
Я работаю со следующей настройкой конфигурации Apache commons.Эта настройка позволяет системным свойствам и / или переменным среды переопределять свойства файла конфигурации.У меня есть ряд свойств файла конфигурации со значениями, такими как "dspace.url".
При тестировании этого приложения в Docker было бы очень удобно переопределить эти значения, передав переменную окружения в контейнер.
Обратите внимание, что период в имени переменной среды трудно установить из командной строки.Сбой следующей команды.
export dspace.url=/some/path
Однако переменная может быть установлена при запуске Docker.
docker run -e dspace.url=/some/path ...
Если я подключаюсь к своему экземпляру Docker, я вижу, что переменная среды присутствует.
docker exec myapp /bin/bash
Из этой оболочки следующая команда показывает, что переменная установлена.
env |grep "dspace.url"
Вот проблема, с которой я сталкиваюсь.Когда я пытаюсь переопределить такое значение в моем более крупном приложении, конфигурация загружает большинство переменных моего окружения, но не загружает переменные окружения, в именах которых есть точка.
Я попытался изолировать проблемунаписав следующую программу.Когда я запускаю эту программу как отдельное приложение, я могу получить доступ к переменным среды, таким как «dspace.url».В частности, System.getenv () возвращает эти значения.
public static void main(String[] args) {
//builder.setFile(new File("config.xml"));
try {
DefaultConfigurationBuilder builder = new DefaultConfigurationBuilder("config-definition.xml");
Configuration config = builder.getConfiguration(true);
for(Iterator<String> keys = config.getKeys(); keys.hasNext(); ) {
System.out.println("TBTB1 "+keys.next());
}
System.out.println("");
for(Iterator<String> keys=new EnvironmentConfiguration().getKeys(); keys.hasNext();) {
System.out.println("TBTB2 "+keys.next());
}
System.out.println("");
for(String s: System.getenv().keySet()) {
System.out.println("TBTB3"+s);
}
System.out.println(config.getString("dspace.foo"));
System.out.println(config.getString("dspace.name"));
} catch (ConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Если я запускаю этот же код, скомпилированный в моем более крупном приложении, я не вижу переменных среды, содержащих точки.
МожетВы думаете о каких-либо других различиях, чтобы исследовать?