grails中的外部属性文件3

时间:2015-03-29 23:01:23

标签: grails

我需要从grails 3中的外部文件属性中读取配置。在grails 2.x中,我将文件链接到:

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

在config.groovy中,但grails 3中不存在此文件。

你有什么想法解决的吗?

6 个答案:

答案 0 :(得分:3)

因为Grails 3是基于Spring Boot构建的,所以可以使用Spring Boot机制来实现外部化属性。即,使用spring.config.location命令行参数或SPRING_BOOT_LOCATION环境变量。 Here's the Spring documentation page on it

文档为命令行参数提供的示例如下:

$ java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties

我一直在使用它的方法是设置一个环境变量,如下所示:

export SPRING_CONFIG_LOCATION="/home/user/application-name/application.yml"

一个很好的功能是你可以在应用程序中捆绑的属性文件中保留一些属性,但是如果有一些你不想包含的属性(例如密码),那么可以专门设置这些属性。外部配置文件。

答案 1 :(得分:1)

You can use

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

答案 2 :(得分:0)

答案 3 :(得分:0)

从.jar文件运行时,我发现Spring Boot查看application.yml文件的当前目录。

java -jar app-0.3.jar

在当前目录中,我创建了一个带有一行的application.yml文件:

org.xyz.app.title: 'XYZZY'

我还使用此文件来指定数据库和其他此类信息。

答案 4 :(得分:0)

查看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"

首先,我需要将此文件放在应用程序的根目录中。例如,我已经使用外部配置文件app-config.yml跟踪我的Grails 3应用程序的结构:

[human@machine 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
  3. 来源:https://gist.github.com/ManvendraSK/8b166b47514ca817d36e

答案 5 :(得分:-1)

我在Grails 3中从外部位置读取属性文件时遇到了同样的问题。我发现了这个plugin,它可以帮助我从外部位置读取属性。它具有读取.yml,.groovy文件的功能。

按照文档中提到的步骤进行操作即可。 步骤如下:

  1. 在build.gradle中添加依赖项:

    expect(wrapper.state("Person")).toEqual({
         name: "sample name",
         school: "sample school name"
    });
    
  2. dependencies {compile 'org.grails.plugins:external-config:1.2.2'} 中添加此内容:

    application.yml
  3. 在外部位置创建文件。就我而言,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

  4. 构建应用程序并运行。