我知道你可以为grails创建几个自定义环境。
我的问题是我希望这些自定义环境适用于生产模式(每个部门的每个环境都有不同的数据库和配置)。
有没有特别的方法来定义它们?如果我按原样部署它们,那么战争是战争还是试战?
由于
答案 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配置。