如何访问Spring Boot中通过命令行传递的属性

时间:2018-06-28 09:15:23

标签: spring

在我们的环境中,服务器侦听的端口始终由命令行参数指定:

java -jar myweb.jar --server.port=1024

我们如何获得这个价值?在我的AppSiteController.java中,我尝试使用:

@Value("${server.port}")
private static String serverPort;

public static void main(String[] args) {
    System.out.println(serverPort);
    SpringApplication.run(AppSiteController.class, args);
}

在命令行上正确指定该值时,它将返回null。

谢谢。

4 个答案:

答案 0 :(得分:1)

将其作为系统参数传递给jvm

java -Dserver.port=8080 -jar spring-boot.jar 

所有java系统参数都已添加到spring环境中

答案 1 :(得分:0)

对于Spring Boot 2.x,您可以覆盖如下系统属性:

mvn spring-boot:run -Dspring-boot.run.arguments=--server.port=8085

默认情况下,Spring Boot将命令行参数转换为属性,并将其添加为环境变量。

您可以通过以下方式从应用程序的主方法访问命令行参数:

@SpringBootApplication
public class Application extends SpringBootServletInitializer {
    public static void main(String[] args) {
        for(String arg:args) {
            System.out.println(arg);
        }
        SpringApplication.run(Application.class, args);
    }
}

这将打印我们从命令行传递给应用程序的参数。

答案 2 :(得分:0)

而不是使用

@Value("${server.port}")
private static String serverPort;

考虑在springboot应用程序中使用以下内容:

@Bean
    public String value(@Value("#{server.port}")String value){
        return value;
    }

然后将值访问为

SpringApplication.run(AppSiteController.class, args).getBean("value");

并传递命令行

-Dserver.port=...

答案 3 :(得分:0)

经过大量研究,我发现这是因为Spring Boot无法将值注入静态变量。解决方案在这里:

Spring Boot @Value Properties

此代码:

@Value("${server.port}")
private static String serverPort;

应该是这样

private static String serverPort;
@Value("${server.port}")
public void setPort(String value) {
    serverPort = value;
}