首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Springboot在作为systemd服务运行时不会找到环境变量。

Springboot在作为systemd服务运行时不会找到环境变量。
EN

Stack Overflow用户
提问于 2021-04-18 12:16:08
回答 1查看 1.6K关注 0票数 1

我有一个作为系统服务运行的springboot应用程序。我的systemd应用程序服务文件如下所示:

代码语言:javascript
复制
[Unit]
Description=app name
After=syslog.target

[Service]
EnvironmentFile=/etc/environment
User=springboot
ExecStart="/opt/jar-folder-name/app-name.jar"
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

在/etc/environment文件中,指定了一个环境变量:

SOME_ENV_VAR=SOME_VALUE.THAT_CONTAINS_STUFF

在我的springboot应用程序中,我尝试使用System.getenv方法访问环境变量:

代码语言:javascript
复制
    @Bean
    public SomeBean someBean() {
      System.out.println("SOME_ENV_VAR was: ");
      System.out.println(System.getenv("SOME_ENV_VAR"));
      return new ServiceX(System.getenv("SOME_ENV_VAR"));
    }

在我的服务器上,这个输出:

SOME_ENV_VAR为: null

在我自己的机器上,当我使用mvn springboot运行springboot时,它会找到环境变量并很好地打印出来。我还测试了在服务器中,如果我在终端中运行env命令,就会找到/etc/environment中定义的环境变量。

那么,当springboot应用程序作为systemd服务运行时,如何获得springboot来检测环境变量呢?

我的springboot版本:2.3.0ServerOS: Ubuntu 18

我使用ansible systemd模块重新启动应用程序和服务:

代码语言:javascript
复制
---
- name: "Restart application"
  systemd:
    name: "{{ springboot_application_name }}.service"
    enabled: yes
    daemon-reload: yes
    state: restarted
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-18 15:00:39

我不能对问题的Ansible部分发表评论,从spring的角度来看,应用程序可以从多个地方获取配置值,application.properties就是这样的一个位置,环境变量就是这样的另一个地方。更确切地说,是env。变量优先于属性文件中的值。有关指定配置的所有受支持方式列表,请考虑读取文档

现在,考虑到这一点,很明显,这个问题基本上与spring引导无关,它基本上归结为如何在systemd服务中指定环境变量。

那么,您可以尝试创建一个以*.conf结尾的文件

代码语言:javascript
复制
/etc/systemd/system/yourservice.service.d/yourenv.conf

并将变量放在那里:

代码语言:javascript
复制
[Service]
Environment="FOO=foovalue"
Environment="BAR=barvalue"

此外,我在“服务器故障”站点中找到了一个答案,它讨论了几乎所有可能的指定环境变量的方法。因此,请考虑阅读这条线

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67148410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档