Приложение Spring Boot не распознает переменные среды в файле application.yml

там. Я новичок в Загрузка Java Spring, и я пытаюсь установить переменные среды в 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 claims to not accept 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}

Я что-то делаю не так или упускаю? Я ценю вашу помощь, спасибо.

Почему бы просто не установить, например, SPRING_DATSOURCE_URL в качестве переменной среды и пропустить сопоставление имен переменных?

Boris the Spider 30.03.2021 00:48

как вы запускаете свое приложение?

eis 30.03.2021 00:50

@BoristheSpider Я только что попробовал прямо сейчас, и он снова дал мне ту же ошибку.

Goksenin Mert 30.03.2021 00:51

@eis в vscode, с терминала

Goksenin Mert 30.03.2021 00:52

Значит, переменная окружения не устанавливается. Без более подробной информации о том, что вы пытаетесь сделать, непонятно, как помочь. Например, я не уверен, что делает подключаемый модуль Maven, так как полагаю, вы хотите, чтобы переменные выполнялись во время выполнения, а не во время сборки.

Boris the Spider 30.03.2021 00:52
.env не поддерживается Spring Boot, даже если вы добавите зависимость, которая его поддерживает. Переменные среды доступны только для тех переменных, которые действительно доступны в среде. Так что это просто не сработает.
M. Deinum 30.03.2021 08:32

используйте _, а не. : $ {SPRING_DATABASE_URL}

nassim 06.04.2021 12:13
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
45
2

Ответы 2

java-dotenv, который вы используете, был переименован в Котлин-Дотенв. Если вы посмотрите его документацию, вы увидите, как он используется:

With Java

import io.github.cdimascio.dotenv.Dotenv;

Dotenv dotenv = Dotenv.load();

dotenv.get("MY_ENV_VAR1")

Это не то, что делает весенняя загрузка - весенняя загрузка не будет использовать dotenv для получения переменных среды, поэтому, естественно, плагин не будет работать для вашего варианта использования, поэтому файлы .env не будут работать.

Если вы запустите свое приложение, определяя переменную среды при запуске приложения, оно будет работать. Чтобы увидеть, как переменные среды передаются с помощью vscode, см. эта ветка.

Недавно я столкнулся с подобной проблемой и хотел установить переменные среды через .env с application.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 при запуске приложения, чтобы сделать его глобально доступным. Согласно эта ветка, этого можно достичь, просто изменив основную точку входа в 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}

Надеюсь это поможет! Если вам интересно, здесь также является полноценным рабочим примером, в котором я использую этот подход.

Вам не нужен исходный код для чтения env, он должен работать по умолчанию

nassim 06.04.2021 12:11

Другие вопросы по теме