там. Я новичок в Загрузка 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}
Я что-то делаю не так или упускаю? Я ценю вашу помощь, спасибо.
как вы запускаете свое приложение?
@BoristheSpider Я только что попробовал прямо сейчас, и он снова дал мне ту же ошибку.
@eis в vscode, с терминала
Значит, переменная окружения не устанавливается. Без более подробной информации о том, что вы пытаетесь сделать, непонятно, как помочь. Например, я не уверен, что делает подключаемый модуль Maven, так как полагаю, вы хотите, чтобы переменные выполнялись во время выполнения, а не во время сборки.
.env не поддерживается Spring Boot, даже если вы добавите зависимость, которая его поддерживает. Переменные среды доступны только для тех переменных, которые действительно доступны в среде. Так что это просто не сработает.
используйте _, а не. : $ {SPRING_DATABASE_URL}




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, он должен работать по умолчанию
Почему бы просто не установить, например,
SPRING_DATSOURCE_URLв качестве переменной среды и пропустить сопоставление имен переменных?