2010-09-27 2 views
6

Я пытаюсь использовать встроенный механизм Grails для загрузки внешних файлов конфигурации (* .groovy и * .properties) за пределами развернутого WAR-файла. Документация подразумевает, что это всего лишь случай установки grails.config.locations с соответствующими линиями classpath: или file:.grails/внешняя конфигурация/grails.config.locations - абсолютный файл пути «Не существует»?

Я настроил Config.groovy с:

String externalConfigLocation = System.getProperty("SYSTEM_PROPERTY_KEY") 
if (!grails.config.locations || !(grails.config.locations instanceof List)) { 
    grails.config.locations = []  
} 
if (classpathExternalConfigLocation) { 
    String pathToResource = "\"file:${basedir}" + File.separator + externalConfigLocation+"\"" 

    print "Loading external configuration file: ${pathToResource}\n" 
    grails.config.locations << pathToResource 
} 

Однако это не работал, с сообщениями об ошибках, указывающие на файл «не существует». Тем не менее, печать абсолютного пути, хранящегося в grails.config.locations, указывает на это. Я попробовал несколько комбинаций:

  • classpath:configurationFile.properties
  • file:c:\path_to_file\configurationFile.properties
  • c:\path_to_file\configurationFile.properties

, но во всех этих случаях файл не может быть найден.

Очень странно - советую оценить. Или предложения по отладке.

ответ

13

Это то, что я обычно делаю:

grails.config.locations = ["classpath:${appName}-config.groovy", 
          "file:./${appName}-config.groovy"] 
if (System.properties["${appName}.config.location"]) { 
    grails.config.locations << "file:" + System.properties["${appName}.config.location"] 
} 

Это позволяет мне поместить файл в корневом каталоге проекта, чтобы настроить свойства локально при разработке (используя файл: location) и файл в пути к классу сервера при развертывании в качестве войны. Папка lib Tomcat находится в своем пути к классам, так что это хорошее место для размещения файлов, если вы используете Tomcat. Поместив имя приложения в файл, вы можете иметь несколько файлов конфигурации без их перехода друг на друга.

Обязательно добавьте локальный файл конфигурации в svn: ignore или .gitignore, чтобы вы не проверяли его в исходном элементе управления. Каждый разработчик может иметь собственные настройки (или просто использовать значения по умолчанию), не затрагивая других.

Это отличный способ вытеснить пароли базы данных и другие производственные значения. Развертыватель приложения (в идеале не разработчик) управляет файлом и его содержимым, и это позволяет избежать проверки паролей в исходном элементе управления. Гораздо лучше, чем использование JNDI IMO.

+0

Благодарим за это. – Alex

+0

Трюк состоял в том, чтобы использовать grails.config.locations << "classpath:" + classpathExternalConfigLocation и обеспечить, чтобы classpath eclipse/STS указывал на папку, в .classpath файл. Classpath: потенциально сложнее отлаживать, но стоит для относительных путей к файлам – Alex

2

Я не думаю, что вы получите base.dir при запуске войны

Смежные вопросы