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

时间:2018-04-23 23:02:30

标签: tomcat grails tomcat7

我有一个grails应用程序,我在本地运行并使用grails -Dgrails.env=dev run-app构建。以下在我的开发和qa tomcat实例服务器中都是如此。

grailsApplication.config.get('grails.env') == 'dev'

然后grails从application.ymlgrailsApplication.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中找到的任何映射,以获取您提供的密钥。

UPDATE:

我设法使用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)当我使用truegrails -Dgrails.env=dev run-app运行时,在我的本地返回falsegrails -Dgrails.env=dev war可部署的服务器上。

1 个答案:

答案 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,这可能会在以后的版本中修复,但是现在我对此解决方案感到满意。