当前位置: 首页 > 知识库问答 >
问题:

在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中的datasource字段动态(我们知道有不同的方法,但我们目前正在研究这个解决方案)。

      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 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");
    

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

    我们需要在哪个文件夹中以及如何为application.properties分配passwordusernamesqlurlsqlport变量,以便能够看到它们,以及我们如何将它们包含在application.properties中?

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

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

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

  • 共有2个答案

    浦德明
    2023-03-14

    要针对不同的环境拥有不同的配置,最简单的方法就是使用spring配置文件。参见外部配置。

    这给了你很大的灵活性。我正在我的项目中使用它,它非常有帮助。在您的情况下,您将有3个配置文件:'local'、'jenkins'和'openshift'

    然后有3个配置文件特定的属性文件:application-local.propertiesapplication-jenkins.propertiesapplication-openshift.properties

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

    编辑

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

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

    不是。在构建应用程序上下文时,spring将活动配置文件确定为第一步之一。然后使用活动配置文件来决定读取哪些属性文件和实例化哪些bean。一旦应用程序启动,这就无法更改。

    薛扬
    2023-03-14

    你不需要使用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)。 如果Jenk

    • 我在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