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

Posted

技术标签:

【中文标题】如何确保在 Apache Tomcat 中运行的 Spring Boot 应用程序中替换了环境变量占位符?【英文标题】:How to make sure that environment variable placeholders are substituted in a Spring Boot application running in Apache Tomcat? 【发布时间】:2020-10-26 09:48:58 【问题描述】:

我有一个 Spring Boot 应用程序,它在 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

然而,我之后

    使用上述脚本启动 Tomcat, 从 IntelliJ Idea 部署 Spring Boot 应用程序,然后 确保执行使用这些值的代码,

我得到一个异常,表明占位符没有被替换。

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

【问题讨论】:

在 Intellij 中:运行 -> 运行.... -> 编辑配置...:有一个环境变量字段。您可以在那里添加键值对(键:MAIL_HOSTNAME 值:smtp.provider.com)。如果您不是从 Intellij 运行,将 export MAIL_HOSTNAME="smtp.provider.com" 添加到脚本可能会起作用。 @AlbertHendriks 我正在使用“Tomcat,远程”(imgur.com/FqZIt01)配置,在那里找不到环境变量面板。 【参考方案1】:
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 文件中。

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于如何确保在 Apache Tomcat 中运行的 Spring Boot 应用程序中替换了环境变量占位符?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Apache 和 Tomcat 为 Geoserver WMS 设置子域

如何从 Apache 重定向到 Tomcat?

如何在没有 Tomcat 的情况下在 Apache 2.2 上运行 Java 应用程序?

如何确保我的 Apache Spark 设置代码只运行一次?

在 Apache Tomcat 上运行 JSF 项目

如何确保 Tomcat6 在 Windows 上读取 CATALINA_OPTS?