You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何从Maven依赖Jar中读取Spring Boot生效的application.properties

解决方案:读取依赖Jar中生效的application.properties并使用@Value

先给你一个明确的结论:无需额外配置的话,@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

火山引擎 最新活动