spring boot 在 application.properties 中使用 spring.profile.default 时未加载默认配置文件

Posted

技术标签:

【中文标题】spring boot 在 application.properties 中使用 spring.profile.default 时未加载默认配置文件【英文标题】:spring boot not loading default profile while using spring.profile.default in application.properties 【发布时间】:2020-02-13 09:59:26 【问题描述】:

仅供参考:我发誓没有激活配置文件配置,例如 -D 或运行配置

目标

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

问题

我已设置 spring.profile.default = dev ,我希望开发配置文件已激活。但事实并非如此。

我做了什么

Run Environment

Spring-Boot 版本:2.1.2 发布

What I'm referred

1) 如何在 Spring Boot Application 中使用配置文件 - 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 docs(https://docs.spring.io/spring/docs/4.2.0.RELEASE/spring-framework-reference/htmlsingle/#beans-definition-profiles-default) 中,可以将默认配置文件更改为在 application.properties 中设置 spring.profiles.default

但这似乎是一种错误(感谢@Antoniossss)。即使我在application.properties 中设置了它并且控制台显示No active profile set, falling back to default profiles: dev。 然而,dev 个人资料仍未激活。

我发现应该在加载 application.properties 之前更改默认配置文件

这意味着如果在application.properties 中描述了更改默认配置文件,那就太晚了。(IDK 为什么,我不知道,因为 Spring 中有很多层......) 如果使用 -Dspring.default.profile = dev 设置了默认配置文件,则它可以正常工作。

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

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

【问题讨论】:

你能试试spring.profiles.active=dev吗? @HasanCanSaral 你的意思是在application-dev.properties 中添加spring.profile.active=dev 吗? 是的。它按预期工作。如果您有spring.profiles.active=someOtherProfile,您将激活someOtherProfile。如果您一无所有,请通过spring.profiles.default 将您的后备设置为dev @HasanCanSaral 所以,我没有设置任何有效的个人资料。我希望dev 将被激活。因为默认配置文件是dev 这是/曾经是一个错误 - github.com/spring-projects/spring-boot/issues/1219 【参考方案1】:

问题是您在加载应用程序后传递此属性,您需要在应用程序启动时提供此属性

将其作为 JVM 参数传递

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

作为环境变量传递

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

系统变量

SPRING_PROFILES_DEFAULT=dev

【讨论】:

是的,它完全有效。你已经在几秒钟内找到了答案。我花了很多时间才弄清楚?【参考方案2】:

您将默认配置文件后备设置为devspring.profiles.default=dev。如果你有spring.profiles.active=someOtherProfile,你就会激活someOtherProfile

2019-10-16 23:17:02.926 信息 64099 --- [主要] c.e.s.SpringbootdemoappApplication:没有活动的配置文件集,下降 返回默认配置文件:dev

此日志显示dev 配置文件是活动的,因为您没有激活任何明确的配置文件。

【讨论】:

是的,你是对的。但正如您在结果中看到的那样,application.environment 仍然是 Default 值。 你试过spring.profiles.active吗?我怀疑如果没有明确的配置文件集,您的后备配置文件的属性可能不会加载。 我需要在spring.profiles.active 中输入什么值?但是默认属性(这意味着application.properties)已正确加载。因为服务器是在我在application.properties 中描述的端口中启动的。 spring-profiles-active=dev。正如我所说,如果您的应用程序回退到默认配置文件(在您的情况下为dev),您的application.properties 可能会被加载而不是application-dev.properties。可能需要明确设置您的活动个人资料。 哦,falling back to default profiles: dev 表示application.properties 会被加载?我可能对设置默认值有误解...当我将默认配置文件设置为dev 时,我希望默认配置文件将是dev 并且没有激活的配置文件,因此回退到dev ...但是好像不是……对吧?【参考方案3】:

您只配置了默认配置文件。 您需要设置一个活动配置文件,例如spring.profiles.active=dev 在您的应用程序属性中。对于注入当前活动配置文件,

@Value("$spring.profiles.active")
private String currentActiveEnv;

【讨论】:

我能问你为什么吗?默认配置文件与活动配置文件不同?在我看来,如果没有激活的配置文件,则应该激活默认配置文件。不是吗? @MinwooKang 在 sn-p 中,您提到了默认配置文件为 dev。似乎 dev 已正确激活。您是在问为什么在响应中没有得到“这是一个“开发”环境”?这可能会发生,因为您正在向变量注入 @Value("$application.environment") 而不是活动配置文件。 哦,感谢您启发新见解.. 可能是.. 但在dev 配置文件中,我设置了sever.port = 8082,但tomcat 是在@ 中描述的8083 端口中启动的987654325@。这让我更加困惑。如果dev配置文件被正确激活,服务器端口应该是8082,这点毫无疑问。【参考方案4】:

请通过以下链接-

https://medium.com/@khandkesoham7/profiling-with-spring-boot-408b33f8a25f

那家伙解释得很好

并按照以下命令验证 or 命令以生成构建

mvn -Ppreprod package -DskipTests clean verify

【讨论】:

以上是关于spring boot 在 application.properties 中使用 spring.profile.default 时未加载默认配置文件的主要内容,如果未能解决你的问题,请参考以下文章

如何 JUnit 测试 Spring-Boot 的 Application.java

Spring boot 学习 四:spring boot 配置文件 application.yml

如何在 spring-boot 配置中加载 application.yaml 配置以进行硒测试

Spring Boot中application.properties和application.yml文件

如何在spring-boot中添加多个application.properties文件?

spring boot application.properties/application.yml 配置属性大全