如何从Maven依赖Jar中读取Spring Boot生效的application.properties
先给你一个明确的结论:无需额外配置的话,@Value本身就能直接读取到Spring Boot已经加载的生效配置——不管这个配置是来自你的项目代码,还是依赖Jar里的application.properties。不过得先把你们自定义环境文件的问题捋清楚,确保Spring Boot能正确识别并加载这些文件,以及依赖Jar的配置能被纳入全局环境。
先搞懂Spring Boot的配置加载逻辑
Spring Boot默认会自动加载依赖Jar里的application.properties(或者yml文件),只要这个Jar是标准的Spring Boot模块(比如带有spring-boot-starter依赖,或者是用Spring Boot打包插件构建的)。但你们用的是自定义命名的环境参数文件(比如some.project-application.properties.test),这种命名Spring Boot默认不认,得先让它能识别这些文件才行。
针对你的场景的具体操作
1. 确认依赖Jar的配置是否被加载
如果依赖Jar是标准的Spring Boot模块,它的application.properties会被Spring Boot自动加载到全局配置中。这时候你直接用@Value("${配置项键名}")就能读取到里面的配置值——不管你项目里用的是哪个自定义环境文件,只要Spring Boot上下文初始化完成,所有加载的配置都会合并到环境里,@Value会自动取到最终生效的那个值。
2. 让自定义命名的环境文件生效
你们用的some.project-application.properties.test这种文件名,Spring Boot默认不会把它当成环境配置文件。要让它生效,你可以通过启动参数指定配置位置,比如:
java -jar your-app.jar --spring.config.location=classpath:/,file:./publish/some.project-application.properties.test
或者用环境变量来设置:
SPRING_CONFIG_LOCATION=classpath:/,file:./publish/some.project-application.properties.test java -jar your-app.jar
这样Spring Boot会同时加载默认的配置(包括依赖Jar里的)和你指定的自定义环境文件,自定义文件里的配置会覆盖依赖Jar里的同名配置——这也是Spring Boot配置优先级的规则。
3. 无需额外配置用@Value的前提
只要Spring Boot正确加载了所有配置(依赖Jar的+你的自定义环境文件),@Value注解可以直接用,完全不需要额外配置。举个实际例子:
假设依赖Jar的application.properties里有:
demo.api.url=https://default-api.com
而你的自定义some.project-application.properties.dev里有:
demo.api.url=https://dev-api.com
启动时指定dev环境文件后,@Value("${demo.api.url}")会读到https://dev-api.com;如果没指定自定义文件,就会读到依赖Jar里的默认值https://default-api.com。
小技巧:验证哪些配置源被加载了
如果你想确认依赖Jar的配置是否真的被加载了,可以加个简单的调试Bean,打印所有加载的配置源:
import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; import javax.annotation.PostConstruct; @Configuration public class ConfigDebugger { private final Environment environment; public ConfigDebugger(Environment environment) { this.environment = environment; } @PostConstruct public void printConfigSources() { if (environment instanceof org.springframework.core.env.ConfigurableEnvironment) { ((org.springframework.core.env.ConfigurableEnvironment) environment) .getPropertySources().forEach(source -> System.out.println("已加载的配置源: " + source.getName()) ); } } }
启动应用后,控制台会输出所有被加载的配置源,你就能看到依赖Jar里的application.properties和你的自定义文件是否都在列表里了。
内容的提问来源于stack exchange,提问作者Itsik Mauyhas




