【问题标题】:Access environment variable in .conf file for spring boot app在 .conf 文件中访问 Spring Boot 应用程序的环境变量
【发布时间】:2017-04-20 18:42:09
【问题描述】:

我已经通过执行命令设置了环境变量

export test=abcd

当我运行printenvcommand 时,我可以看到 test=abcd

我已经部署了一个 springboot.jar 应用程序,并且我正在从 springboot.conf 文件中传递 JAVA_OPTS。

JAVA_OPTS='-Dspring.profiles.active=aaa -Denv=$test'

我通过 service springboot start 启动了该应用程序。当我检查进程时,env 变量没有 $test 环境变量的值。

/usr/bin/java -Dsun.misc.URLClassPath.disableJarChecking=true -Dspring.profiles.active=aaa -Denv=.

如何访问 conf 文件中的环境变量?我在某处读到环境变量在作为服务运行时将被剥离。基本上我想以service springboot start 的身份运行,它在内部执行以下命令

java -Dspring.profiles.active=aws -Denv=${whatever is set for env environment variable} -jar springboot.jar

我尝试了以下配置,但没有任何效果

JAVA_OPTS='-Dspring.profiles.active=aaa -Denv='$test
JAVA_OPTS='-Dspring.profiles.active=aaa -Denv='${test}
JAVA_OPTS='-Dspring.profiles.active=aaa -Denv=${test}'
JAVA_OPTS="-Dspring.profiles.active=aaa -Denv=$test"

【问题讨论】:

    标签: java spring-boot configuration-files init.d java-opts


    【解决方案1】:

    请注意您的报价。假设您使用“普通”shell,变量不会被替换为单引号。

    java -Dspring.profiles.active=aws -Denv="$myvariable" -jar springboot.jar 应该导致env 在 JVM 中可用,无论您是否将其作为服务运行。

    如果您无法使其工作,请尝试指定一个硬编码值,例如 java -Dspring.profiles.active=aws -Denv=foo -jar springboot.jar。如果env 现在在 JVM 中可用,那么您的问题出在您的 shell 或运行机制上。验证运行命令的用户(即您是否使用 sudo?)设置了变量。

    【讨论】:

    • 参见 tldp.org/LDP/abs/html/quotingvar.html 了解 bash 如何解释引号,在 zsh 或 fish 等许多其他 shell 中类似
    • 基本上我想实现这个[链接]docs.spring.io/spring-boot/docs/current/reference/html/…[链接]。我不想硬编码环境,我希望应用程序作为服务运行。这是我的要求
    • 我试过用双引号,没用。命令 java -Dspring.profiles.active=aws -jar springboot.jar 可以正常工作,因为 env 变量将自动可用于 spring application.yml。我想将它作为服务运行,所以我创建了 springboot.conf,内容如下所示(我尝试了双引号、单引号等)。 JAVA_OPTS="-Dspring.profiles.active=aws -Denv=$env" 。当我们作为服务运行时,我们无法访问环境变量
    【解决方案2】:

    我的 .conf 引用了 .bashrc 中的环境变量时遇到了同样的问题。

    我发现的是: 问题是服务剥离了所有环境变量,但 TERM、PATH 和 LANG 是一件好事。如果您直接执行脚本,则不会删除环境变量,因此一切正常。

    https://unix.stackexchange.com/questions/44370/how-to-make-unix-service-see-environment-variables

    一种解决方案是将您的应用安装为 systemd 服务:

    https://docs.spring.io/spring-boot/docs/1.3.x-SNAPSHOT/reference/html/deployment-install.html

    或者另一种方法是使用 docker,您可以在 docker 文件中指定额外的配置,例如加载包含您的环境变量的文件。

    作为在我的情况下不可用的那些解决方案,我最终在 .conf 文件中获得了值,例如:-Denv=prod

    【讨论】:

      猜你喜欢
      • 2018-02-15
      • 1970-01-01
      • 2021-03-12
      • 2019-03-15
      • 1970-01-01
      • 1970-01-01
      • 2020-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多