【问题标题】:Spring boot not able to resolve OS environment variable?Spring Boot 无法解析操作系统环境变量?
【发布时间】:2025-11-29 19:10:02
【问题描述】:

我将 Spring Boot 服务部署到 AWS 并且 application.properties 引用了作为部署过程的一部分设置的操作系统环境变量之一。 Spring Boot 启动时似乎无法解析 OS 环境变量。

如果我回显变量,它似乎设置正确 -

ubuntu@ip-10-227-74-206:~$ echo $EC2_INSTANCE_ID
i-de8c136d

application.properties 文件引用该变量如下 -

service.hostId=aws-${EC2_INSTANCE_ID}

我在启动应用程序时看到以下错误 -

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.lang.String com.foo.services.registration.config; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'EC2_INSTANCE_ID' in string value "${EC2_INSTANCE_ID}"
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:573)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331)

知道我做错了什么吗?在 application.properties 文件中引用时是否需要添加诸如“sys:”之类的前缀?

【问题讨论】:

  • 你确定这个变量是全局可用的,而不仅仅是本地shell?
  • 是的,变量是在 /etc/environment 文件中定义的,它是通过 /etc/bash.bashrc 获取的。登录主机而不是回显工作。可能是我完全错误的路径,但在论坛上的一些阅读表明 init 脚本可能没有使用交互式登录 shell。

标签: spring spring-boot


【解决方案1】:

花了很多时间,感觉跟spring-boot中的init脚本有关。我发现了一些不理想的解决方法,但完成了 -

init conf 文件中的源环境变量。

来源 /etc/环境

这使得环境变量能够成为启动 Spring Boot 应用程序的父进程。现在将所有环境变量作为 JAVA_OPTS 传递到 conf 文件中

JAVA_OPTS="-Denv.variable=${var.foo}"

【讨论】:

    【解决方案2】:

    使用@ConfigurationProperties@Value 注释在您的bean 中注入操作系统变量。

    参考:Spring Boot documentation about Externalized Configuration

    【讨论】: