
4.3 在外部覆盖配置值
问题
如何在运行时覆盖配置值?
解决方案
你可以在运行时通过将其设置为系统属性或环境变量来覆盖任何配置属性。
Quarkus允许你通过将配置设置为系统属性(-Dproperty.name=value)或环境变量(export PROPERTY_NAME=value)来覆盖任何配置属性。系统属性比环境变量有更高的优先级。
例如数据库的URL、用户名或密码,它们只有在目标环境中才被知晓。但是你需要知道,这里有一个权衡:可用的运行时属性越多,Quarkus在构建时期的前期能做的就越少。
让我们将4.1节中使用的应用程序打包,并通过设置一个系统属性来覆盖greeting.message的值:
在一个新的终端窗口中,通过运行以下命令来验证属性值是否已从Hello World被覆盖为Aloha:
在环境变量的情况下,一个给定的属性名有三种命名惯例,这是因为有些操作系统只允许使用字母和下划线(_),而不允许使用点(.)等其他字符。为了支持所有可能的操作系统,Quarkus使用了以下规则:
1.完全匹配(greeting.message)。
2.将非字母数字字符替换为下划线(greeting_message)。
3.将非字母数字字符替换为下划线,并将其余字符转换为大写字母(GREETING_MESSAGE)。
例如下面的application.properties文件:
你可以使用以下任何一个环境变量名覆盖它的值,因为它们都是等价的:
还有一个特殊的地方,你可以把application.properties文件放在应用程序本身之外——应用程序运行的名为config的目录中,在该文件中定义的任何运行时属性将覆盖默认配置。
config/application.properties在开发模式下也能使用,但你需要把它添加到你的构建工具输出目录上才行(如果是Maven,则是target目录;如果是Grandle,则是build目录),所以你要注意在运行clean任务时需要重新创建它。
除了环境变量和application.properties文件,还可以在当前工作目录下放置一个.env文件,按照环境变量的格式(GREETING_MESSAGE=Aloha)来覆盖配置值。