如何确保在 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 设置子域
如何在没有 Tomcat 的情况下在 Apache 2.2 上运行 Java 应用程序?