多环境属性在依赖JAR与应用项目之间的优先级

编程语言 2026-07-09

给定一个常规的 ./src/main/resources/application.properties./src/main/resources/application-dev.properties
此外,还有一个库jar,其资源中也包含 application.propertiesapplication-dev.properties 文件。

这4 个属性文件的优先级是什么?换句话说,如果同一个属性在多个文件中被指定,最终会使用哪一个?

enter image description here

我发现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将 ConfigSourceordinal 排序(序数最高者获胜)。

ConfigSourceordinal 相同的情形下,例如 application.properties,它将首先使用应用程序中的 application.properties,然后再来自jar的 classpath。从jar classpath加载文件的顺序是不确定的,因为它取决于 ClassLoader

如果存在针对某个profile的文件,且该profile已激活,它们的优先级将高于普通文件(但仍遵循普通文件的加载顺序:先应用程序文件,再是jar classpath)。这也是为什么当你有带profile的资源时,Quarkus需要一个 application.properties(即使为空)来确保排序的一致性的原因。

你始终可以通过在源的配置值中添加 config_ordinal=[int] 来控制 ConfigSource 的序数。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章