使用application.properties中的spring.profile.default时,Spring Boot无法加载默认配置文件。

5

注意:我发誓没有类似于-D或运行配置的激活配置文件

目标

当应用程序在没有激活任何配置文件的情况下启动时,默认激活dev配置文件。

问题

我设置了spring.profile.default = dev,我期望会激活dev配置文件,但实际上没有。

我的操作

运行环境

Spring-Boot版本:2.1.2 Release

参考资料

1)如何在Spring Boot应用程序中使用配置文件 - https://www.javacodegeeks.com/2019/07/profiles-spring-boot-application.html#respond

这是我的代码

/resources/application.properties

spring.profiles.default= dev

application.environment=This is a "Default" Environment

/resources/application-dev.properties

application.environment=This is a "dev" Environment
server.port= 8082

/ProfileController.java

@RestController
@RequestMapping("/v1")
public class ProfileController {

    @Value("${application.environment}")
    private String applicationEnv;

    @GetMapping
    public String getApplicationEnv(){
        return applicationEnv;
    }
}

结果

localhost/v1=>这是一个“默认”环境。

并且

我已经正确地发现默认配置文件被设置为dev

这是我的spring-boot日志。

2019-10-16 23:17:02.926 INFO 64099 --- [main] c.e.s.SpringbootdemoappApplication :没有活动配置文件集,退回到默认配置文件集: dev

为服务器端口添加另一条记录

2019-10-17 00:25:03.837 INFO 68318 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer:Tomcat初始化了端口:8083(http)

我添加原因是它似乎不涉及注入问题。

关闭此问题的时间

我想要实现的第一个目标是更改默认配置文件。 从Spring文档中(https://docs.spring.io/spring/docs/4.2.0.RELEASE/spring-framework-reference/htmlsingle/#beans-definition-profiles-default),默认配置文件可以通过在application.properties中设置spring.profiles.default来更改。

但似乎有点bug(感谢@Antoniossss)。即使我在application.properties中设置了它,控制台也显示没有活动配置文件集,退回到默认配置文件集: dev。 但是仍然没有激活dev配置文件。

我发现的事情是更改默认配置文件应该在加载application.properties之前完成

这意味着如果更改默认配置文件是在application.properties中描述的,则为时已晚。(不知为何,因为Spring有很多层...) 如果使用-Dspring.default.profile=dev设置了默认配置文件,则可以正常工作。

来自https://github.com/spring-projects/spring-boot/issues/1219

您不能通过在配置文件中声明来更改默认配置文件。在读取配置文件之前必须准备好它。


@Antoniossss 我不能说 Dev 已经被激活了。Dev 被设置为默认值。如果没有激活的配置文件,则可能会激活默认配置文件。但现在并没有激活。这是一个问题。 - Minwoo Kang
@Deadpool,实际上我正在遵循这篇文章(https://www.javacodegeeks.com/2019/07/profiles-spring-boot-application.html#respond),但请给我一些时间从文档中找到答案。 - Minwoo Kang
我认为Spring没有那个属性,您需要使用 spring.profiles.active。 @MinwooKang https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html - Ryuzaki L
1
这是/曾经是一个错误 - https://github.com/spring-projects/spring-boot/issues/1219 - Antoniossss
@Deadpool FYI:http://docs.spring.io/spring/docs/4.2.0.RELEASE/spring-framework-reference/htmlsingle/#beans-definition-profiles-default - Minwoo Kang
显示剩余11条评论
4个回答

4
问题在于您在应用程序加载后传递这些属性,您需要在应用程序启动时提供这些属性。
请将它作为JVM参数传递。
java -jar -Dspring.profiles.default=dev myproject.jar

作为环境变量传递

java -jar myproject.jar --spring.profiles.default=dev

系统变量
SPRING_PROFILES_DEFAULT=dev

1
是的,它完全正常工作。你在几秒钟内找到了答案。我花了很多时间才弄清楚。 - Minwoo Kang

0

你可以通过设置 spring.profiles.default=dev 将默认配置文件设置为 dev。如果你设置了 spring.profiles.active=someOtherProfile,那么就会激活 someOtherProfile

2019-10-16 23:17:02.926 INFO 64099 --- [ main] c.e.s.SpringbootdemoappApplication : 没有设置任何配置文件,将使用默认配置文件:dev

这个日志说明当前激活的配置文件是 dev,因为你没有显式地激活其他配置文件。


是的,你说得对。 但是正如你在结果中看到的那样,application.environment仍然是Default值。 - Minwoo Kang
你尝试使用 spring.profiles.active 了吗?如果没有明确设置配置文件,我怀疑你的回退配置文件的属性可能没有被加载。 - Hasan Can Saral
我需要在 spring.profiles.active 中放入什么值?但默认属性(即 application.properties)已正确加载。因为服务器是在我在 application.properties 中描述的端口上启动的。 - Minwoo Kang
1
spring-profiles-active=dev。如果您的应用程序回退到默认配置文件(在您的情况下为 dev),则可能会加载您的 application.properties 而不是 application-dev.properties。需要明确设置活动配置文件。 - Hasan Can Saral
哦,“回退到默认配置文件:dev”是指将加载“application.properties”吗? 我可能对设置默认配置有误解... 当我将默认配置文件设置为“dev”时,我期望默认配置文件将是“dev”,并且没有激活的配置文件,因此会回退到“dev”...但似乎不是这样..对吗? - Minwoo Kang
显示剩余2条评论

0

0
你只配置了默认配置文件。 你需要在应用属性中设置一个活动配置文件,例如spring.profiles.active=dev。 为了注入当前活动配置文件,...
@Value("${spring.profiles.active}")
private String currentActiveEnv;

我可以问一下你为什么吗?默认配置文件与活动配置文件不同吗?在我看来,如果没有激活的配置文件,那么默认配置文件应该被激活。不是吗? - Minwoo Kang
@MinwooKang 在代码片段中,您已经将默认配置文件设置为dev。而且看起来dev已经被正确激活了。您是在问为什么响应中没有收到“This is a 'dev' Environment”吗?这可能是因为您正在将@Value("${application.environment}")注入变量,而不是活动配置文件。 - Haagenti
哦,感谢您的启发。这可能是...但是在dev配置文件中,我已经设置了server.port = 8082,但是Tomcat在application.properties中描述的8083端口启动了。 这让我更困惑了。如果已正确激活dev配置文件,服务器端口应该是8082,这就不会有疑问了。 - Minwoo Kang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接