Мне нужна конфигурация чтения из внешних свойств файла в grails 3. В grails 2.x я связываю файл с:
grails.config.locations = ["classpath:config.properties"]
В config.groovy, но этот файл не существует в grails 3.
У вас есть идеи для решения?
Мне нужна конфигурация чтения из внешних свойств файла в grails 3. В grails 2.x я связываю файл с:
grails.config.locations = ["classpath:config.properties"]
В config.groovy, но этот файл не существует в grails 3.
У вас есть идеи для решения?
Поскольку Grails 3 построен на Spring Boot, вы можете использовать механизмы Spring Boot для внешних свойств. А именно, используя spring.config.location
командной строки SPRING_BOOT_LOCATION
или переменную среды SPRING_BOOT_LOCATION
. Здесь находится страница документации Spring.
Например, в документации для параметра командной строки указано следующее:
$ java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
Способ, которым я его использовал, - это установить переменную среды, например:
export SPRING_CONFIG_LOCATION="/home/user/application-name/application.yml"
Одна из приятных функций заключается в том, что вы можете оставить некоторые свойства в файле свойств, входящем в приложение, но если есть некоторые свойства, которые вы не хотите включать (например, пароли), они могут быть установлены специально во внешней конфигурации файл.
You can use
def cfg = new ConfigSlurper.parse(getClass().classLoader.getResource('path/myExternalConfigfile.groovy'))
Похоже, что внешняя конфигурация отсутствует из коробки: http://grails.1312388.n4.nabble.com/Grails-3-External-config-td4658823.html
При запуске из файла.jar я обнаружил, что Spring Boot просматривает текущий каталог для файла application.yml.
java -jar app-0.3.jar
В текущем каталоге я создал файл application.yml с одной строкой:
org.xyz.app.title: 'XYZZY'
Я также использовал этот файл, чтобы указать базу данных и другую такую информацию.
Взгляните на https://gist.github.com/reduardo7/d14ea1cd09108425e0f5ecc8d3d7fca0
Работая над Grails 3 я понял, что больше не может указать внешнюю конфигурацию, используя стандартное grails.config.locations
свойства в Config.groovy
файл.
Причина очевидна! В Grails 3 нет Config.groovy
. Вместо этого мы теперь используем application.yml
для настройки свойств. Однако вы также не можете указать внешнюю конфигурацию с помощью этого файла!
Какого черта?
Теперь Grails 3 использует концепцию источника Spring. Чтобы включить внешний файл конфигурации, нам нужно сделать что-то дополнительное.
Предположим, я хочу переопределить некоторые свойства в файле application.yml
с моим внешним файлом конфигурации.
Например, из этого:
dataSource:
username: sa
password:
driverClassName: "org.h2.Driver"
К этому:
dataSource:
username: root
password: mysql
driverClassName: "com.mysql.jdbc.Driver"
Сначала мне нужно разместить этот файл в корне приложения. Например, у меня есть следующая структура моего приложения Grails 3 с внешним конфигурационным файлом app-config.yml
:
[[email protected] tmp]$ tree -L 1 myapp
myapp
├── app-config.yml // <---- external configuration file!
├── build.gradle
├── gradle
├── gradle.properties
├── gradlew
├── gradlew.bat
├── grails-app
└── src
Теперь, чтобы включить чтение этого файла, просто добавьте следующее:
В файл build.gradle
bootRun {
// local.config.location is just a random name. You can use yours.
jvmArgs = ['-Dlocal.config.location=app-config.yml']
}
В файл Application.groovy
package com.mycompany
import grails.boot.GrailsApp
import grails.boot.config.GrailsAutoConfiguration
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean
import org.springframework.context.EnvironmentAware
import org.springframework.core.env.Environment
import org.springframework.core.env.PropertiesPropertySource
import org.springframework.core.io.FileSystemResource
import org.springframework.core.io.Resource
class Application extends GrailsAutoConfiguration implements EnvironmentAware {
public final static String LOCAL_CONFIG_LOCATION = "local.config.location"
static void main(String[] args) {
GrailsApp.run(Application, args)
}
@Override
void setEnvironment(Environment environment) {
String configPath = System.properties[LOCAL_CONFIG_LOCATION]
if (!configPath) {
throw new RuntimeException("Local configuration location variable is required: " + LOCAL_CONFIG_LOCATION)
}
File configFile = new File(configPath)
if (!configFile.exists()) {
throw new RuntimeException("Configuration file is required: " + configPath)
}
Resource resourceConfig = new FileSystemResource(configPath)
YamlPropertiesFactoryBean ypfb = new YamlPropertiesFactoryBean()
ypfb.setResources([resourceConfig] as Resource[])
ypfb.afterPropertiesSet()
Properties properties = ypfb.getObject()
environment.propertySources.addFirst(new PropertiesPropertySource(LOCAL_CONFIG_LOCATION, properties))
}
}
Обратите внимание: класс Application
реализует интерфейс EnvironmentAware
и переопределяет setEnvironment(Environment environment):void
.
Теперь это все, что вам нужно для повторного включения внешнего файла конфигурации в приложении Grails 3.
Код и руководство взяты из следующих ссылок с небольшими изменениями:
Источник: https://gist.github.com/ManvendraSK/8b166b47514ca817d36e
У меня возникла та же проблема при чтении файла свойств из внешнего местоположения в Grails 3. Я нашел этот плагин, который помогает мне читать свойства из внешнего местоположения. Он также имеет функцию чтения файлов .yml,.groovy.
Следуйте инструкциям, приведенным в документации, и все заработает. Шаги похожи на:
Добавьте зависимость в build.gradle:
dependencies {compile 'org.grails.plugins:external-config:1.2.2'}
Добавьте это в application.yml grails: config: locations: - classpath:myconfig.groovy - classpath:myconfig.yml - classpath:myconfig.properties - file:///etc/app/myconfig.groovy - file:///etc/app/myconfig.yml - file:///etc/app/myconfig.properties - ~/.grails/myconfig.groovy - ~/.grails/myconfig.yml - ~/.grails/myconfig.properties - file:${catalina.base}/myconfig.groovy - file:${catalina.base}/myconfig.yml - file:${catalina.base}/myconfig.properties
Создать файл на внешнем месте. В моем случае "/opt/gra/application.yml"
Создайте приложение и запустите.
Надеюсь, это кому-нибудь поможет.