如何告诉Grails应用程序它在哪个环境中?
我希望在grails应用程序中加载特定于环境的配置,以便根据grails应用程序运行在哪个JVM上,我可以指向特定于环境的url。在我的例子中,当我的应用程序从dev转到prod时,我有4个不同的环境要处理(而不是grails应用程序假定的默认3个) 我的JVM都定义了一个系统属性,当我执行“System.getProperty()”时,它会告诉我应用程序正在哪个环境上运行 我的问题是,在运行时检查和加载特定于环境的配置的最佳位置是哪里?内部引导。groovy?我没有使用命令行或grails{env_name}war构建war文件的选项如何告诉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
谢谢。将变量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获取名称,如上面的示例所示。