如何确保环境变量占位符在 Apache Tomcat 中的 Spring 引导应用程序 运行 中被替换?

How to make sure that environment variable placeholders are substituted in a Spring Boot application running in Apache Tomcat?

我有一个 Spring 启动应用程序,它在 Apache Tomcat 服务器上运行。在 application.yaml 中,除其他外,我有以下条目:

mail:
  pop3Host: ${MAIL_HOSTNAME}
  inboxFolder: ${MAIL_INBOX}
  hostName: ${MAIL_HOSTNAME}
  port: ${MAIL_PORT}
  userName: ${MAIL_USERNAME}
  password: ${MAIL_PASSWORD}

应用程序已从 IntelliJ Idea 部署到 Tomcat,因此我可以对其进行调试。

我使用以下命令启动 Tomcat:

export JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,address=8090,server=y,suspend=n"
export JAVA_OPTS=" -DMAIL_HOSTNAME='smtp.provider.com' -DMAIL_INBOX='MAIL_INBOX' -DMAIL_PORT='587' -DMAIL_USERNAME='username' -DMAIL_PASSWORD='XXXXXXXX'"
export CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=8090,server=y,suspend=n"
./catalina.sh jpda start

然而,在我

之后
  1. 使用上面的脚本开始Tomcat,
  2. 从 IntelliJ Idea 部署 Spring 引导应用程序,并且
  3. 确保执行了使用这些值的代码,

我收到异常,表明占位符尚未被替换。

我该如何解决,我。 e.确保我可以通过环境变量在 application.yaml 中指定一些信息(如用户名和密码)(这样我就不会在 application.yaml 中包含实际凭据)?

无法将 JVM 参数从 IDE 传递到远程计算机中的进程 运行。当进程在远程机器上启动时,Spring 引导参数将从 JVM 参数加载。很抱歉,这行不通。

我建议的替代解决方案是,使用 spring 配置服务器为远程调试配置创建一个单独的配置文件(就像我们为开发、QA 环境等所做的那样)。当您尝试调试应用程序时,请使用 jenkins 作业重新启动远程应用程序(我假设您没有远程访问应用程序 运行 所在的框)通过在 jenkins 作业中传递配置文件名称您想要的值将被拾取。如果您需要更多详细信息,请告诉我。

export JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,address=8090,server=y,suspend=n"
export JAVA_OPTS=" -DMAIL_HOSTNAME='smtp.provider.com' -DMAIL_INBOX='MAIL_INBOX' -DMAIL_PORT='587' -DMAIL_USERNAME='username' -DMAIL_PASSWORD='XXXXXXXX'"
export CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=8090,server=y,suspend=n"
./catalina.sh jpda start

在上面的行中添加 export MAIL_HOSTNAME= 等,或者用这些行创建一个 setenv.sh 文件(在与 catalina.sh 文件相同的目录中)。

使用 setenv.sh 记录在 Apache Tomcat 的 RUNNING.txt 文件中。