如何在grails中定义多个生产环境

时间:2015-08-03 15:38:11

标签: grails

我知道你可以为grails创建几个自定义环境。

我的问题是我希望这些自定义环境适用于生产模式(每个部门的每个环境都有不同的数据库和配置)。

有没有特别的方法来定义它们?如果我按原样部署它们,那么战争是战争还是试战?

由于

2 个答案:

答案 0 :(得分:1)

解决这个问题的正确方法是使用Externalized Configuration

通过这样做,您将为每个部门提供为其环境配置应用程序的灵活性,并且您不需要为每个部门打包应用程序。

答案 1 :(得分:0)

我没有完整的解决方案,但我会分享我所知道的。

ServletContext提供了可以在应用程序外部设置的 init参数。然后,servlet容器使它们可用于app / context。返回这些参数的方法称为initParameterNames()

例如,假设我正在使用Tomcat 8运行应用程序,该应用程序名为 example-app 。要设置一些 init parameters ,我要创建文件 $ CATALINA_BASE / conf / Catalina / localhost / example-app.xml

在文件中,我会保存我的参数:

<Context>
    <Parameter name="environments.production.dataSource.url" value="jdbc:h2:anotherProdDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE" override="true" />
</Context>

从Grails我可以从ServletContext访问这个值。例如,从GSP我可以读取这样的值:

application.getInitParameter('environments.production.dataSource.url')

理想情况下,我会在启动过程的早期将 init参数与Grails配置(grailsApplication.config)合并,以便 init参数覆盖Grails配置。但我无法弄清楚如何做到这一点。 Grails配置可以从GrailsAutoConfiguration(并且显然可修改)访问,如下所示:

import grails.boot.GrailsApp
import grails.boot.config.GrailsAutoConfiguration
import grails.boot.config.GrailsApplicationPostProcessor
import grails.core.GrailsApplication

class Application extends GrailsAutoConfiguration {
    static void main(String[] args) {
        GrailsApp.run(Application, args)
    }

    GrailsApplicationPostProcessor grailsApplicationPostProcessor() {
        def processor = super.grailsApplicationPostProcessor()

        processor.grailsApplication.config.setAt('environments.production.dataSource.url', 'testing...')

        return processor
    }
}

但我不知道如何访问 grailsApplicationPostProcessor()中的ServletContext,以便使用 init参数覆盖Grails配置