首页 > 解决方案 > spring boot JAR作为服务运行时无法加载系统环境变量

问题描述

我有一个简单的弹簧启动应用程序,它返回系统环境变量的值

应用程序属性

my-var=${SYSTEM_ENV_VAR}

哪里SYSTEM_ENV_VAR是定义的系统变量/etc/environment

DemoApp.java

@SpringBootApplication
@RestController
public class DemoApplication {

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

    @Value("${my-var}")
    String env;

    @GetMapping(path = "/")
    public String get() {
        return "This: " + env;
    }
}

我遵循创建可执行jar的过程mvn clean package

现在,当我将 jar 执行为 时/home/ubuntu/sample-app/target/demo-0.0.1-SNAPSHOT.jar,我得到了系统环境变量的正确值

我创建了一个服务

/etc/systemd/system/demoapp.service

[Unit]
Description=desc
After=syslog.target

[Service]
EnvironmentFile=-/etc/environment
User=root    
ExecStart=/home/ubuntu/sample-app/target/demo-0.0.1-SNAPSHOT.jar
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

我将服务执行为sudo systemctl start demoapp.service.

当我检查状态sudo systemctl status demoapp.service时,我看到一个错误跟踪

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 
'SYSTEM_ENV_VAR' in value "${SYSTEM_ENV_VAR}"

但我知道/etc/environment正在加载,因为我可以在日志中看到其他条目,这些条目显示了我所有系统环境的加载

谁能帮我这个?谢谢。

标签: javaspring-boot

解决方案


您用于 ${my-var} 的值不应该是 ${SYSTEM_ENV_VAR} 而应该是系统变量的实际路径。所以你的 application.properties 应该有

my-var=path/to/system/variable

并不是

my-var=${SYSTEM_ENV_VAR}


推荐阅读