Spring Boot App 无法识别 application.yml 文件中的环境变量

问题描述

那里。我是 Java Spring Boot 的新手,我正在尝试在 application.yml 中设置环境变量。

添加了 dotenv maven 依赖:

<!-- https://mvnrepository.com/artifact/io.github.cdimascio/java-dotenv -->
        <dependency>
            <groupId>io.github.cdimascio</groupId>
            <artifactId>java-dotenv</artifactId>
            <version>5.1.3</version>
        </dependency>

我在 .env 文件中设置了变量:

SPRING_DATABASE_URL = jdbc://db_url
SPRING_DATABASE_USERNAME = username
SPRING_DATABASE_PASSWORD = password

在我的 application.yml 中:

spring:
    datasource:
        url: ${SPRING_DATABASE_URL}
        username: ${env.SPRING_DATABASE_USERNAME}
        password: ${env.SPRING_DATABASE_PASSWORD}

在运行应用程序时出现 jdbc 错误

java.lang.RuntimeException: Driver org.postgresql.Driver 声称不接受 jdbcUrl,${SPRING_DATABASE_URL}

我尝试了一些解决方案,例如:

export SPRING_DATABASE_URL = jdbc://db_url

或在 application.yml 中:

url: ${env.SPRING_DATABASE_URL}

url: ${env.SPRING.DATABASE.URL}

url: ${SPRING.DATABASE.URL}

我做错了什么或遗漏了什么?感谢您的帮助,谢谢。

解决方法

您使用的

java-dotenv 已重命名为 kotlin-dotenv。如果您查看它的文档,您将了解它是如何使用的:

使用 Java

导入 io.github.cdimascio.dotenv.Dotenv;

Dotenv dotenv = Dotenv.load();

dotenv.get("MY_ENV_VAR1")

这不是 spring boot 所做的 - spring boot 不会使用任何 dotenv 来获取环境变量,因此该插件自然不适用于您的用例,因此 .env 文件将不起作用。

如果您在启动应用程序时定义环境变量来启动应用程序,它将起作用。要了解如何使用 vscode 传递环境变量,请参阅 this thread

,

我最近遇到了类似的问题,想通过 .envapplication.yml 设置环境变量 - 这是我发现的:

首先,正如您提到的,您必须将 java-dotenv 依赖项添加到 pom.xml

<dependency>
  <groupId>io.github.cdimascio</groupId>
  <artifactId>dotenv-java</artifactId>
  <version>2.2.0</version>
</dependency>

然后在项目的根目录(.env 所在的位置)创建您的 pom.xml 文件并编写您的环境变量,例如ENV_PORT=8081

在使用此环境变量之前,您必须在启动应用程序时将 .env 文件的内容与 Spring Boot“绑定”,使其全局可用。根据 this thread 的说法,这可以通过简单地改变 spring 的主要入口点(您在其中初始化框架)来实现:

@SpringBootApplication
public class MySpringApplication {

    public static void main(String[] args) {

        Map<String,Object> env = Dotenv.load()
                .entries()
                .stream()
                .collect(
                        Collectors.toMap(DotenvEntry::getKey,DotenvEntry::getValue));
        new SpringApplicationBuilder(MySpringApplication.class)
                .environment(new StandardEnvironment() {
                    @Override
                    protected void customizePropertySources(MutablePropertySources propertySources) {
                        super.customizePropertySources(propertySources);
                        propertySources.addLast(new MapPropertySource("dotenvProperties",env));
                    }
                }).run(args);
    }
}

就是这样,现在您可以像这样在 application.yml 中引用您的环境变量:

server:
  port: ${ENV_PORT}

希望这有帮助!如果您有兴趣,here 也是我使用这种方法的完整工作示例。