如何告诉Grails应用程序它所处的环境?

时间:2014-08-27 17:45:13

标签: grails grails-2.0 grails-config

我想在我的grails应用程序中加载特定于环境的配置,以便根据运行grails应用程序的JVM,我可以指向特定于环境的URL。在我的情况下,当我的应用程序从dev变为prod时,我有4种不同的环境可供使用(而不是grails app假定的默认值3)。

我的JVM都定义了一个System属性,当我执行“System.getProperty()”时,告诉我该应用程序运行的环境。

我的问题是,在运行时检查和加载环境特定配置的最佳位置是什么?在BootStrap.groovy里面?我没有使用命令行或grails {env_name} war来构建war文件的选项。

感谢。

5 个答案:

答案 0 :(得分:15)

将变量grailsEnv设置为Tomcat的环境Java变量,下面是一个示例:

set CATALINA_OPTS=%CATALINA_OPTS% -Xms256m -Xmx1024m -Dgrails.env=development

在grails命令行上添加环境变量:

grails run-app -Dgrails.env=stage

您可以使用检查环境变量,如下所示:

    if (grails.util.Environment.current.name == "development") {
        UsageCodeDefinition ucd = new UsageCodeDefinition()
        ucd.setDescription("UFARSFileUpload Upload Development")
        ucd.setFiscalYear("12-13")
        ucd.setInstructions("Welcome to UFARSFileUpload Development were Open")
        ucd.save(failOnError: true)
    }

您可以使用枚举值而不是名称变量,但如果使用自定义环境值,则它们将映射到枚举自定义,并使用名称来区分自定义值。

   if (grails.util.Environment.current == grails.util.Environment.DEVELOPMENT) {

答案 1 :(得分:4)

不设置JVM启动参数:

-Dgrails.env=whatever

您的Grails应用将使用

中设置的值
<yourapp>/WEB-INF/classes/application.properties

将会设置如下值:

grails.env=development

此默认环境值由构建战争时使用的选项决定。你可以用

建立战争
-Dgrails.env=development war

然后application.properties将有grails.env =开发,如果你关闭它,它默认为grails.env = production

就您的问题而言,您并未具体说明使用“特定于环境的网址”的配置。目前尚不清楚如何存储这些特定于环境的网址。例如,如果URL变量是Grails服务的成员变量,并且您要在Config.groovy中存储特定于环境的URL,那么您可以

import grails.util.Environment

...
//inject the GrailsApplication Configuration in Config.groovy
def grailsApplication
//Hold the URL value from Config.groovy
String environmentUrl
...
Environment current = Environment.getCurrent()

if(Environment.PRODUCTION == current) { 
    environmentUrl = grailsApplication.config.PRODUCTION_URL
} else {
    environmentUrl = grailsApplication.config.DEVELOPMENT_URL
}

Config.groovy的地方

PRODUCTION_URL = "http://blah.com/blah/"
DEVELOPMENT_URL = "http://blah.dev/blah"

希望有所帮助。

答案 2 :(得分:1)

如果你有一个可用的System属性告诉你你在哪个环境,你只需在Config.groovy文件中添加if语句或switch语句,如下所示:

if (System.getProperty("foo") == "myTestEnvironment") {
    myConfigSetting = "test"
} else if (System.getProperty("foo") == "myProductionEnvironment") {
    myConfigSetting = "production"
}

此解决方案也适用于grails-app/conf

下的其他配置文件

使用groovy ConfigSlurper解析Grails配置文件,这样就可以将可执行代码放在那里而不会出现问题。

答案 3 :(得分:0)

很抱歉这是迟到的,但另一种方法是在BootStrap.groovy中注入配置属性。

例如:

if (currentEnv == Environment.DEVELOPMENT) {
    ...
    grailsApplication.config.some.property = DEVELOPMENT_ENVRIONMENT
    ...
}
else if (currentEnv == Environment.TEST) {
    ...
    grailsApplication.config.some.property = TEST_ENVIRONMENT
    ...
}

我最近使用过它并且效果非常好。我们正在使用Grails 2.5.2

答案 4 :(得分:0)

作为其他答案的附录:

您可以使用 Environment.isDevelopmentMode() 或以更简洁的方式 Environment.developmentMode 检查环境是否设置为开发。当您采用仅修改生产设置为默认代码的开发设置的方法时,这很有用。