Файл внешних свойств в grails 3

Мне нужна конфигурация чтения из внешних свойств файла в grails 3. В grails 2.x я связываю файл с:

grails.config.locations = ["classpath:config.properties"]

В config.groovy, но этот файл не существует в grails 3.

У вас есть идеи для решения?

Ответ 1

Поскольку 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"

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

Ответ 2

You can use

def cfg = new ConfigSlurper.parse(getClass().classLoader.getResource('path/myExternalConfigfile.groovy'))

Ответ 4

При запуске из файла.jar я обнаружил, что Spring Boot просматривает текущий каталог для файла application.yml.

java -jar app-0.3.jar

В текущем каталоге я создал файл application.yml с одной строкой:

org.xyz.app.title: 'XYZZY'

Я также использовал этот файл, чтобы указать базу данных и другую такую информацию.

Ответ 5

Взгляните на https://gist.github.com/reduardo7/d14ea1cd09108425e0f5ecc8d3d7fca0

Внешняя конфигурация в Grails 3

Работая над 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.

Код и руководство взяты из следующих ссылок с небольшими изменениями:

  1. http://grails.1312388.n4.nabble.com/Grails-3-External-config-td4658823.html
  2. https://groups.google.com/forum/#!topic/grails-dev-discuss/_5VtFz4SpDY

Источник: https://gist.github.com/ManvendraSK/8b166b47514ca817d36e

Ответ 6

У меня возникла та же проблема при чтении файла свойств из внешнего местоположения в Grails 3. Я нашел этот плагин, который помогает мне читать свойства из внешнего местоположения. Он также имеет функцию чтения файлов .yml,.groovy.

Следуйте инструкциям, приведенным в документации, и все заработает. Шаги похожи на:

  1. Добавьте зависимость в build.gradle:

    dependencies {compile 'org.grails.plugins:external-config:1.2.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

  3. Создать файл на внешнем месте. В моем случае "/opt/gra/application.yml"

Создайте приложение и запустите.

Надеюсь, это кому-нибудь поможет.