多环境属性在依赖JAR与应用项目之间的优先级
给定一个常规的 ./src/main/resources/application.properties 与 ./src/main/resources/application-dev.properties。
此外,还有一个库jar,其资源中也包含 application.properties 与 application-dev.properties 文件。
这4 个属性文件的优先级是什么?换句话说,如果同一个属性在多个文件中被指定,最终会使用哪一个?
我发现app.some.feature.enabled的值是true(本应为false),想要澄清我的理解。
//打印每个属性文件的序数
for (ConfigSource source : ConfigProvider.getConfig().getConfigSources()) {
LOG.infof("Source: %s | Ordinal: %d", source.getName(), source.getOrdinal());
}
结果:
Source: PropertiesConfigSource[source=file:/home/xxx/_workspace/app/target/classes/application-dev.properties] | Ordinal: 251
Source: PropertiesConfigSource[source=jar:file:/home/xxx/.m2/repository/org/abcd/commons/0.0.241/commons-0.0.241.jar!/application-dev.properties] | Ordinal: 251
Source: PropertiesConfigSource[source=file:/home/xxx/_workspace/app/target/classes/application.properties] | Ordinal: 250
Source: PropertiesConfigSource[source=jar:file:///home/xxx/.m2/repository/org/abcd/commons/0.0.241/commons-0.0.241.jar!/application.properties] | Ordinal: 250
解决方案
Quarkus将 ConfigSource 按 ordinal 排序(序数最高者获胜)。
在 ConfigSource 的 ordinal 相同的情形下,例如 application.properties,它将首先使用应用程序中的 application.properties,然后再来自jar的 classpath。从jar classpath加载文件的顺序是不确定的,因为它取决于 ClassLoader。
如果存在针对某个profile的文件,且该profile已激活,它们的优先级将高于普通文件(但仍遵循普通文件的加载顺序:先应用程序文件,再是jar classpath)。这也是为什么当你有带profile的资源时,Quarkus需要一个 application.properties(即使为空)来确保排序的一致性的原因。
你始终可以通过在源的配置值中添加 config_ordinal=[int] 来控制 ConfigSource 的序数。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。
