Как загрузить ${catalina.home}/conf/application.properties в Spring/Tomcat webapp?
Как загрузить ${catalina.home}/conf/application.properties
в Spring/Tomcat webapp?
Оглядываясь на StackOverflow и Google, я вижу много дискуссий, которые утверждают, что это возможно. Однако это просто не работает для меня. В соответствии с рекомендациями моего исследования мой файл Spring applicationContext.xml
содержит следующую строку:
<context:property-placeholder location="${catalina.home}/conf/application.properties"/>
Но я получаю это в журналах:
Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/Users/username/Servers/apache-tomcat-6.0.36/conf/application.properties]
Из записи журнала я вижу, что ${catalina.home}
расширяется правильно. Когда я разворачиваю его вручную в файле applicationContext.xml
, он возвращает ту же ошибку. Следующее возвращает содержимое файла application.properties как ожидалось:
cat /Users/username/Servers/apache-tomcat-6.0.36/conf/application.properties
Итак, путь явно правильный. Является ли это проблемой безопасности webapp или проблемы с конфигурацией сервера Tomcat?
Ответы
Ответ 1
location
context:property-placeholder
- это ресурс, что означает, что если вы укажете только путь к файлу (в отличие от полного URL-адреса с протоколом), то путь будет разрешен в отношении базового каталога веб-приложения - он пытается загрузить /Users/username/Servers/apache-tomcat-6.0.36/webapps/<appname>/Users/username/Servers/apache-tomcat-6.0.36/conf/application.properties
, которого не существует. Если вы префикс его file:
, он будет работать так, как вам нужно:
<context:property-placeholder location="file:${catalina.home}/conf/application.properties"/>
Ответ 2
Для настройки на основе аннотаций вы можете использовать:
@PropertySource("file:${catalina.home}/conf/application.properties")