将文件添加到Spring Boot的类路径中

我有server.yml文件,它只包含
Spring Framework属性,如端口号,上下文根路径,应用程序名称.

而且,我有一个applicationContext.xml,它具有以下内容:

<util:properties id="springProperties" location="classpath*:my.properties">
<context:property-placeholder location="classpath*:my.properties"
        local-override="true" properties-ref="springProperties" />

my.properties文件驻留在项目的src / main / resources目录中.

那么,我可以从我的java类访问属性,如:

@Autowired
@Qualifier("springProperties")
private Properties props; 

public String getProperty(String key){
    return props.getProperty(key);
}

or like `${my.prop}`

当我构建war并运行Spring Boot(java -jar server.war)时,内部my.properties会解析,一切都按预期工作.

但是,我想用外部my.properties覆盖该文件.
我读了https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

我试图运行类似的东西:

java -jar server.jar –spring.config.location = classpath:/my.properties或

java -jar server.jar –spring.config.location = my.properties

但我可以覆盖的唯一属性来自我的server.yml.意思是,我可以覆盖端口号或应用程序名称.但是内部的my.properties从未受到影响.

难道我做错了什么?我知道外部my.property应该只是在一个类路径中,然后它会覆盖内部的my.property.但它永远不会发生.

最佳答案 您可以使用@PropertySource({“classpath:override.properties”})从类路径添加额外的文件,然后使用Environment对象获取值的值或@Value注释

@PropertySource({ "classpath:other.properties" })
@Configuration
public class Config{
    @Autowired
    private Environment env; //use env.getProperty("my.prop")

    @Value("${my.prop}")
    private String allowedpatterns;
}

@Component
public OthenClass{

    @Autowired
    //If this class is not component or Spring annotated class then get it from ApplicationContext
    private Environment env; //use env.getProperty("my.prop")

    @Value("${my.prop}")
    private String allowedpatterns;
}

如果您使用的是Spring Boot代码,则可以使用它来获取ApplicationContext

ConfigurableApplicationContext ctx = app.run(args);

Environment env = ctx.getBean(Environment.class);
点赞