当前位置: 首页 > 面试题库 >

在Spring Boot的application.properties中使用env变量

董元徽
2023-03-14
问题内容

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

  • 我们拥有的设置是我们首先在本地对其进行测试(意味着我们需要在PC上安装MySql);
  • 然后我们推向Bitbucket ;
  • Jenkins自动检测到对Bitbucket的新推送并在其上进行构建(要使Jenkins mvn构建通过,我们还需要在运行Jenkins的虚拟机上安装MySql)。
  • 如果Jenkins构建通过,我们会将代码推送到OpenShift上的应用程序(使用Jenkins上的Openshift部署插件)。

我们的问题,因为你可能已经想通了就是:

application.properties我们不能对MySql信息进行硬编码。由于我们的项目将在3个不同的地方(local,Jenkins和OpenShift)运行,因此我们需要使数据源字段动态化application.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"

我们已经做到了,而且行得通。我们还检查了Map<String, String> env = System.getenv();是否可以将环境变量设置为java变量,如下所示:

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而这正是我们遇到的麻烦。

在哪个文件夹,以及如何做,我们需要分配password,userName,sqlURL,sqlPort变量application.properties能够看到他们,我们如何将它们包含在application.properties

我们尝试了许多事情,其中​​之一是:

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

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

非常感谢你的帮助!!


问题答案:

你不需要使用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.profiles.active。Spring将通过application-{profile-name}.properties模板自动读取适当的属性文件。



 类似资料:
  • 我们正在做一个spring boot web应用程序,我们使用的数据库是MySQL; > 我们的设置是首先在本地测试它(意味着我们需要在PC上安装MySQL); 然后我们推到Bitbucket; Jenkins自动检测对Bitbucket的新推送,并在其上进行构建(为了通过Jenkins mvn构建,我们还需要在运行Jenkins的虚拟机上安装MySQL)。 如果Jenkins构建通过,我们将代码

  • 我在php项目中有一个Dockerfile,我需要在执行过程中传递用户和密码以下载库。 用户和密码必须在生产或本地 .env 文件中隐藏。目前我只是尝试本地选项,用户和密码为空。 我使用过和,但不仅登录失败,而且当我打印变量时,它们是空的。我也试过将变量硬编码,它工作正常,所以问题是变量没有从. env文件中检索。 docker compose开始如下 还有 Dockerfile: .env 的开

  • 我的文件夹根目录上有一个。env文件。这是我的。环境 我试图访问application.yml上的PORT变量,但它没有从。env文件中读取变量。这是我的申请。yml

  • 我正在尝试dockerize一个基本的nodejs应用程序。我的dockerfile如下 但我总是收到同样的错误 我该怎么解决?

  • 我正在使用Spring Boot2,通过阅读这里关于外部化属性的文档,我希望可以通过声明一个同名的os环境变量来覆盖application.properties中变量的值。 所以我做了如下的尝试。 首先,在中声明以下2个变量 > Spring可以看到环境变量,而不管是否有have点(.)是否在变量名中,如和所示 Spring只能在中使用同名os环境变量的值重写该变量的值,前提是该变量的名称不包含点

  • 基本值.yaml service-x-values.yaml 值文件的计算顺序为: null