未在tomcat中设置Grails环境。application.yml文件不使用自定义环境设置

未在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应用程序,使用
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

Invoke
Environment.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') { 
  ...
}