如何告诉Grails应用程序它在哪个环境中?

如何告诉Grails应用程序它在哪个环境中?,grails,grails-2.0,grails-config,Grails,Grails 2.0,Grails Config,我希望在grails应用程序中加载特定于环境的配置,以便根据grails应用程序运行在哪个JVM上,我可以指向特定于环境的url。在我的例子中,当我的应用程序从dev转到prod时,我有4个不同的环境要处理(而不是grails应用程序假定的默认3个) 我的JVM都定义了一个系统属性,当我执行“System.getProperty()”时,它会告诉我应用程序正在哪个环境上运行 我的问题是,在运行时检查和加载特定于环境的配置的最佳位置是哪里?内部引导。groovy?我没有使用命令行或grails{e

我希望在grails应用程序中加载特定于环境的配置,以便根据grails应用程序运行在哪个JVM上,我可以指向特定于环境的url。在我的例子中,当我的应用程序从dev转到prod时,我有4个不同的环境要处理(而不是grails应用程序假定的默认3个)

我的JVM都定义了一个系统属性,当我执行“System.getProperty()”时,它会告诉我应用程序正在哪个环境上运行

我的问题是,在运行时检查和加载特定于环境的配置的最佳位置是哪里?内部引导。groovy?我没有使用命令行或grails{env_name}war构建war文件的选项


谢谢。

将变量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 (System.getProperty("foo") == "myTestEnvironment") {
    myConfigSetting = "test"
} else if (System.getProperty("foo") == "myProductionEnvironment") {
    myConfigSetting = "production"
}
grails.env=development
可以使用枚举值而不是名称变量,但如果使用自定义环境值,则它们将映射到枚举自定义值,并使用名称区分自定义值

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

如果您有一个系统属性可以告诉您所处的环境,您只需在
Config.groovy
文件中添加If语句或switch语句,如下所示:

    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 (System.getProperty("foo") == "myTestEnvironment") {
    myConfigSetting = "test"
} else if (System.getProperty("foo") == "myProductionEnvironment") {
    myConfigSetting = "production"
}
grails.env=development
此解决方案也适用于
grails app/conf


Grails配置文件是使用groovy ConfigSlurper解析的,因此您可以毫无问题地将可执行代码放入其中。

无需设置JVM启动参数:

-Dgrails.env=whatever
您的grails应用程序将使用中设置的值

<yourapp>/WEB-INF/classes/application.properties
此默认环境值由构建war时使用的选项决定。你可以用它来制造战争

-Dgrails.env=development war
然后application.properties将具有grails.env=development,如果不使用该选项,则默认为grails.env=production

就您的问题而言,您不清楚配置为使用“特定于环境的URL”的内容。目前还不清楚如何存储这些特定于环境的URL。例如,如果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"

希望这会有所帮助。

很抱歉,时间太晚了,但另一种方法是在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作为其他答案的补充:


您可以使用环境。或者以更常规的方式
Environment.developmentMode
检查环境是否设置为development。当您采取仅修改代码中默认生产设置的开发设置的方法时,这非常有用。

您只需要在这里::)谢谢。我读过。我很难理解grails如何知道/区分它当前所在的环境?当应用程序从dev移动到prod时,它如何知道它是prod?这取决于。如果您使用
runapp
运行grails应用程序,那么您可以将环境名称与
runapp
命令一起传递。例如,如果您在Tomcat中部署它,您将创建特定于环境的war,并且您可以在构建war时选择环境(
GrailsWAR
)。在“为不同的环境打包和运行”一节的链接文档页面中,所有这些都有很好的描述。谢谢Pawel。我真的很感谢你的帮助。在我使用的设置中,我使用maven和一些构建脚本从dev…prod移动代码。在打包战争时,我们从不告诉应用程序,因为我们试图不可知地编程我们的应用程序环境。这就是为什么,当grails应用程序启动并加载配置时,我需要动态地检查环境。如果不想为每个JVM构建单独的WAR文件,可以添加代码来检查系统属性的值,并根据该值设置配置。这是我得到的。但我很难找到“在运行时检查和加载特定于环境的配置的最佳位置是什么?”的答案,Grails会根据您设置的环境使用环境DSL(如DataSource.groovy)中设置的值。否则,您可以从grails.util.Environment.current.name获取名称,如上面的示例所示。