在 Spring Boot 的应用程序中使用 env 变量。属性

2022-08-31 04:58:59

我们正在开发一个Spring Boot Web应用程序,我们使用的数据库是MySQL;

  • 我们的设置是首先在本地测试它(意味着我们需要在PC上安装MySQL);

  • 然后我们推到Bitbucket;

  • Jenkins 会自动检测对 Bitbucket 的新推送,并在其上进行构建(对于 Jenkins mvn 构建的传递,我们还需要在运行 Jenkins 的虚拟机上安装 MySQL)。

  • 如果 Jenkins 构建传递,我们会将代码推送到 OpenShift 上的应用程序(使用 Jenkins 上的 Openshift 部署插件)。

正如您可能已经弄清楚的那样,我们遇到的问题是:

  • 在我们不能硬编码MySQL信息。由于我们的项目将在3个不同的地方(本地JenkinsOpenShift)运行,我们需要使数据源字段动态化(我们知道有不同的方法来做到这一点,但我们现在正在研究这个解决方案)。application.propertiesapplication.properties

      spring.datasource.url = 
      spring.datasource.username = 
      spring.datasource.password = 
    

我们提出的解决方案是在本地和 Jenkins VM 中创建系统环境变量(以与 OpenShift 命名它们相同的方式命名它们),并分别为它们分配正确的值:

export OPENSHIFT_MYSQL_DB_HOST="jdbc:mysql://localhost"
export OPENSHIFT_MYSQL_DB_PORT="3306"
export OPENSHIFT_MYSQL_DB_USERNAME="root"
export OPENSHIFT_MYSQL_DB_PASSWORD="123asd"

我们已经这样做了,它有效。我们还检查了环境变量可以按如下方式转换为java变量:Map<String, String> env = System.getenv();

String password = env.get("OPENSHIFT_MYSQL_DB_PASSWORD");   
String userName = env.get("OPENSHIFT_MYSQL_DB_USERNAME");   
String sqlURL = env.get("OPENSHIFT_MYSQL_DB_HOST"); 
String sqlPort = env.get("OPENSHIFT_MYSQL_DB_PORT");

现在剩下的唯一事情是我们需要在我们的中使用这些java变量,这就是我们遇到的问题。application.properties

在哪个文件夹中,以及如何分配,我们需要分配,,和变量才能看到它们,以及如何将它们包含在中?passworduserNamesqlURLsqlPortapplication.propertiesapplication.properties

我们尝试了很多事情,其中之一就是:

spring.datasource.url = ${sqlURL}:${sqlPort}/"nameofDB"
spring.datasource.username = ${userName}
spring.datasource.password = ${password}

到目前为止没有运气。我们可能没有将这些环境变量放在正确的类/文件夹中,或者在 中错误地使用它们。application.properties


答案 1

您不需要使用 java 变量。要包含系统环境变量,请将以下内容添加到您的文件中:application.properties

spring.datasource.url = ${OPENSHIFT_MYSQL_DB_HOST}:${OPENSHIFT_MYSQL_DB_PORT}/"nameofDB"
spring.datasource.username = ${OPENSHIFT_MYSQL_DB_USERNAME}
spring.datasource.password = ${OPENSHIFT_MYSQL_DB_PASSWORD}

但是@Stefan Isele建议的方式更可取,因为在这种情况下,您只需要声明一个env变量:。Spring将通过模板自动读取相应的属性文件。spring.profiles.activeapplication-{profile-name}.properties


答案 2

针对不同环境设置不同配置的最简单方法是使用弹簧型材。请参阅外部化配置

这为您提供了很大的灵活性。我正在我的项目中使用它,它非常有帮助。在你的情况下,你会有3个配置文件:“本地”,“jenkins”和“openshift”

然后,您将拥有 3 个特定于配置文件的属性文件:、 和application-local.propertiesapplication-jenkins.propertiesapplication-openshift.properties

在那里,您可以设置相关环境的属性。运行应用程序时,必须指定要激活的配置文件,如下所示:-Dspring.profiles.active=jenkins

编辑

根据spring文档,您可以设置系统环境变量以激活配置文件,而无需将其作为参数传递。SPRING_PROFILES_ACTIVE

有没有办法在运行时传递Web应用程序的活动配置文件选项?

不。在构建应用程序上下文时,Spring 将活动配置文件确定为第一步。然后,活动配置文件用于决定读取哪些属性文件以及实例化哪些 Bean。应用程序启动后,无法更改。


推荐