Spring Boot App 无法识别 application.yml 文件中的环境变量
Posted
技术标签:
【中文标题】Spring Boot App 无法识别 application.yml 文件中的环境变量【英文标题】:Spring Boot App does not recognize environment variables in application.yml file 【发布时间】:2021-06-25 22:42:14 【问题描述】:那里。我是 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:驱动程序 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
我做错了什么或遗漏了什么?感谢您的帮助,谢谢。
【问题讨论】:
为什么不直接设置,例如SPRING_DATSOURCE_URL
作为环境变量,跳过变量名之间的映射?
您的应用运行情况如何?
@BoristheSpider 我刚刚尝试过,它又给了我同样的错误。
@eis 在 vscode 中,来自终端
那么环境变量没有被设置。如果没有更多关于你想要做什么的细节,就不清楚如何提供帮助。例如,我不确定 Maven 插件会做什么,因为我假设您希望变量在运行时而不是构建时。
【参考方案1】:
我最近遇到了类似的问题,想通过.env
和application.yml
设置环境变量 - 这是我发现的:
首先,正如您提到的,您必须将 java-dotenv 依赖项添加到 pom.xml
:
<dependency>
<groupId>io.github.cdimascio</groupId>
<artifactId>dotenv-java</artifactId>
<version>2.2.0</version>
</dependency>
然后在项目的根目录(pom.xml
所在的位置)中创建 .env
文件并编写环境变量,例如ENV_PORT=8081
.
在您可以使用此环境变量之前,您必须在启动应用程序时将.env
文件的内容与 Spring Boot “绑定”以使其全局可用。根据this thread,这可以通过简单地改变你的 Spring 的 Main 入口点(你初始化框架的地方)来实现,如下所示:
@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 也是我使用这种方法的完整工作示例。
【讨论】:
你应该不需要源代码来读取环境,它应该默认工作【参考方案2】:您使用的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。
【讨论】:
以上是关于Spring Boot App 无法识别 application.yml 文件中的环境变量的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot + Thymeleaf Security 无法识别
Spring boot spring.batch.job.enabled=false 无法识别
Spring boot spring.batch.job.enabled=false 无法识别
Spring Boot 无法连接到 MySQL:无法识别服务器时区值“Mitteleuropäische Zeit”