我正在将 Spring Boot 应用程序从版本 1.5.7 迁移到 2.0.0,我注意到由于某种原因它不再从 ENV 变量获取邮件属性。
我正在使用 java.mail.Sender
并在我的 application.properties
文件中具有以下属性:
spring.mail.host=smtp.example.com
spring.mail.username=username
spring.mail.password=password
spring.mail.port=587
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.defaultEncoding=UTF-8
这只是为了在测试中模拟邮件属性。我使用与 ENV 变量相同的 key 注入(inject)真实的 key :spring.mail.host=smtp.google.com
等
但是当我尝试发送电子邮件时,我发现它仍在使用 smtp.example.com
。我认为 ENV 变量的优先级高于 application.properties
中的值。有什么改变吗? Spring Boot 1.5.7 中一切正常。
编辑: 以下命令有效,所以这肯定是 Eclipse 的问题:
SPRING_PROFILES_ACTIVE=development SPRING_MAIL_HOST=smtp.gmail.com SPRING_MAIL_USERNAME=xxx SPRING_MAIL_PASSWORD=xxx ./gradlew clean bootRun
我不明白的是,为什么当我切换回 1.5.7 时,完全相同的配置会起作用。同样奇怪的是,当通过 Eclipse 运行配置传递环境变量时,它适用于配置文件。所以有些环境变量被应用,有些则没有......
最佳答案
我能够重现这个问题。使用 1.5.X 创建了一个 Spring boot 应用程序,并从 Eclipse 注入(inject)了环境变量。现在,当我迁移到 2.X 版本时,环境变量不会被注入(inject)。
进一步分析,发现这个有趣的thread
因此,我的结论是,当我们使用 2.X 版本时,Spring-boot-parent 中有一个组件,它使 spring boot maven 插件 fork 它并在单独的 JVM 中运行。因此,环境变量没有被传递。
这回答了为什么从环境部分获取配置文件值的问题。无论应用程序是在 Maven JVM 还是新的 JVM 中运行,配置文件标志始终作为参数传递
要确认这一点,您可以将配置条目添加到 JVM 参数选项卡,如下所示
您现在将能够看到传递给 Spring Boot 的新值
关于java - 迁移后 Eclipse 不会将邮件属性传递给 Spring Boot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49108511/