将Spring Boot JAR作为服务运行时无法加载系统环境变量

时间:2019-06-04 21:49:29

标签: java spring-boot

我有一个简单的spring boot应用程序,它返回系统环境变量的值

application.properties

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;
    }
}

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

现在,当我以/home/ubuntu/sample-app/target/demo-0.0.1-SNAPSHOT.jar的身份执行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正在加载,因为我可以在日志中看到其他条目,这些条目显示了所有系统环境的加载情况

有人可以帮我吗?谢谢。

2 个答案:

答案 0 :(得分:1)

您用于$ {my-var}的值不应为$ {SYSTEM_ENV_VAR},而应为系统变量的实际路径。 因此,您的application.properties应该具有

my-var=path/to/system/variable

而不是

my-var=${SYSTEM_ENV_VAR}

答案 1 :(得分:0)

好的。所以这就是我最终要做的。

我注意到删除export中的/etc/environment关键字会导致SYSTEM_ENV_VAR的值被解释和显示。

但是现在apache开始抱怨,因为它找不到SYSTEM_ENV_VAR的值。因此,我将声明分为两部分。因此文件看起来像:

/ etc / environment

export SYSTEM_ENV_VAR
SYSTEM_ENV_VAR=the-value

这样,apache和spring boot都很高兴。