一尘不染

使用命令行参数覆盖spring-boot中的yml配置不起作用

spring-boot

我有一个Spring Boot应用程序。我想在执行jar时覆盖在application.yml中配置的某些属性。

我的代码是这样的:

@Service
public class CommandService {

    @Value("${name:defaultName}")
    private String name;

    public void print() {
        System.out.println(name);
    }
}

而且Application.java是

@SpringBootApplication
public class Application implements CommandLineRunner {

    @Autowired
    private CommandService commandService;

    public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }

    @Override
    public void run(String... args) throws Exception {
        commandService.print();
    }
}

application.yml

名称:nameInApplication

当我执行这样的命令时:

java -jar app.jar –name = nameInCommand

不行

第二个命令也不起作用:

java -Dname = nameInCommand2 -jar app.jar

但是,如果application.yml没有配置名称,则第二个命令将正常运行,而第一个命令也将不起作用。


阅读 1682

收藏
2020-05-30

共1个答案

一尘不染

这已经有几个月了,但是我要回答这个问题,因为我刚遇到这个问题,并通过Google找到了您的问题,而Ivan的评论则使我记忆犹新。由于他没有详细说明,而且我不确定您是否已解决问题(现在可能已经解决了),因此您将需要更改:

public static void main(String[] args) {
    SpringApplication.run(Application.class);
}

public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
}

这么简单。之前的参数传入时永远不会流逝,因此不会覆盖您的application.yml属性。因此,以防万一您还没有弄清楚它,或者如果有人像我一样偶然发现了这个问题,这就是Ivan的意思。

启动时是否传递命令行参数 SpringApplication.run(...)

2020-05-30