Grails3配置加载策略

Grails 3的官方配置文档对grails3加载配置的策略,以及覆盖策略提之甚少,有价值的参考信息太少。由于Grails3基于Spring-boot项目,因此通过更底层的Spring-boot的配置说明,可以得到很多有价值的信息。

详细的Spring-boot配置参考官方文档,这里仅罗列出几个重要的

改变应用程序的properties文件的路径

  • 在应用程序代码中显式指明@PropertySource
  • 设置spring.config.name这个system property(或SPRING_CONFIG_NAME环境变量)指定配置文件的主文件名, 默认application
  • 设置spring.config.location这个system property(或SPRING_CONFIG_LOCATION环境变量) 指明加载的文件路径(e.g. a classpath resource or a URL).单独设置一个环境配置文件,此配置可以被system properties, 环境变量,或命令行参数覆盖

无论程序运行于哪种environment配置下,Spring Boot总会按照上面描述的规则加载application.properties。如果有.yml后缀的yaml配置文件,也会一并加载进来。

Spring Boot的配置文件的log在DEBUG级别下会打印,在TRACE以上级别关闭打印。

使用短命令行参数覆盖

如果想使用--port=9000代替--server.port=9000覆盖默认的property属性,在application.properties文件使用占位符即可:

server.port=${port:8080}

这样也可以通过大写的环境变量PORT覆盖配置。

依赖环境的配置文件

依赖环境的配置文件可以起名application-${profile}.properties,这样spring boot通过-Dspring.profiles.activeSPRING_PROFILES_ACTIVE环境变量指定运行环境时就会加载对应的${profile}的配置文件。

Grails官方文档提及的方案

准确来说,Grails官方文档使用的方案是上述使用短命令行参数覆盖使用的方案(当然其他方案同样适用于Grails3,只不过官方文档没提)。

官方文档的范例如下:

production:
    dataSource:
        url: '${JDBC_CONNECTION_STRING}'

这里就代表这个dataSource.url的值希望通过system property(-DJDBC_CONNECTION_STRING命令行参数)或环境变量(JDBC_CONNECTION_STRING,环境变量可以覆盖默认properties官方文档没提)提供。并未提及实际还可以用'${JDBC_CONNECTION_STRING:DEFAULT_JDBC_STRING}'这种方式给定默认值。

对于gradle工程,官方提供的参考build.gradle配置文件:

bootRun {
    systemProperties = System.properties
}

test {
    systemProperties = System.properties
}

表示bootRun这个task(对应Grails的run-app)和test这个task(对应Grails的test-app)在运行的时候,将system properties传递给grails项目。

在gradle指定system properties的方法有两种:

  • 在gradle命令行上指定-Dproperty=value参数
  • gradle.properties文件中指定systemProp.property=value属性

参考资料

Grails3配置文档: http://docs.grails.org/latest/guide/conf.html
Spring Boot配置文档: https://docs.spring.io/spring-boot/docs/current/reference/html/howto-properties-and-configuration.html

推荐阅读更多精彩内容