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