grails / внешняя конфигурация / grails.config.locations - файл абсолютного пути "Не существует"? - PullRequest
7 голосов
/ 27 сентября 2010

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

Я настроил 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

но во всех этих случаяхфайл не найден

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

Ответы [ 2 ]

13 голосов
/ 28 сентября 2010

Я обычно так и делаю:

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"]
}

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

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

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

2 голосов
/ 28 сентября 2010

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

...