我有一个grails应用程序,我在本地运行并使用grails -Dgrails.env=dev run-app
构建。以下在我的开发和qa tomcat实例服务器中都是如此。
grailsApplication.config.get('grails.env') == 'dev'
然后grails从application.yml
到grailsApplication.config
属性找到正确的配置。 (有关说明,请参阅下面的第一个更新)。
当我们的构建服务器使用war
构造grails -Dgrails.env=dev war
文件时,我收到了META-INF中具有设置为dev
的正确环境变量的build.info的正确战争。但是,打电话
grailsApplication.config.get('grails.env') == '{"initializing":"true"}'
根据grails.util.Environment
类:
/**
* Whether Grails is in the middle of bootstrapping or not
*/
public static final String INITIALIZING = "grails.env.initializing";
我尝试使用较短的grails <env> war
语法设置变量,并将其置于GRAILS_OPTS
变量中无效。但是我相信只要它最终出现在META-INF/grails.build.info
文件中它理论上应该有用(参见grails.util.Environment.resolveCurrentEnvironment()
方法)。
据我所知,这里的区别是tomcat,但我无法告诉你为什么它会在初始化时冻结。我没有任何其他非平凡的方式,我可以设置环境变量,除了这种方法,AFAIK是这样做的标准方法。
有什么想法吗?
P.S。我通过临时控制器访问此属性,该控制器将grailsApplication
注入其中并返回它在grailsApplication.config
中找到的任何映射,以获取您提供的密钥。
我设法使用Environment.current.name
找到了正确的环境,所以如果需要,我目前还有一个解决方法,但我的application.yml
中存在的自定义属性仍未被提取。
e.g。
# application.yml
app.my-prop: false
environments:
dev:
app:
my-prop: true
grailsApplication.config.getProperty(&#39; app.my-prop&#39;,boolean,false)当我使用true
但grails -Dgrails.env=dev run-app
运行时,在我的本地返回false
在grails -Dgrails.env=dev war
可部署的服务器上。
答案 0 :(得分:0)
在解析配置之前调用Environment.getCurrent()
。
现在有效。我不是100%肯定为什么,但我有一个理论:
我想仅将控制器限制在开发环境中,我记得我的一位同事使用方法GrailsUtil.isDevelopmentEnv()
来检查,所以作为预防措施,我添加了if
语句来检查环境在渲染配置值响应之前。
if (GrailsUtil.isDevelopmentEnv() || System.getProperty(Environment.KEY) == 'dev') {
...
}
但是,一旦我添加了检查,自定义application.yml
属性就会正确解析!
我目前的理论是Environment.getCurrent()
方法GrailsUtil.isDevelopmentEnv()
检查系统属性,然后如果找不到,检查META-INF / grails.build.info文件和缓存结果。也许问题是,在调用grailsApplication.config.getProperty()
但是没有通过此方法初始化时,环境设置会以这种方式解决。
我使用的是grails版本3.1.16,这可能会在以后的版本中修复,但是现在我对此解决方案感到满意。