在Spring Boot中设置默认的活动配置文件

93

如果没有设置-Dspring.profiles.active,我希望我的默认活动配置文件是production

我在我的application.properties中尝试了以下内容,但它没有起作用:

spring.profiles.default=production

Spring-boot 版本 = 1.3.5.RELEASE

16个回答

121

您在此处所做的是设置默认的默认配置文件(如果您不指定@Profile注释,则该配置文件将用于任何bean)为production

您实际需要做的是设置默认的活动配置文件,方法如下:

spring.profiles.active=production

26
那个方法可行,而且参数-Dspring.profiles.active=development覆盖了它,这正是我想要的。 - DarVar
@PaulNUK 这里的“production”是什么意思? - KJEjava48
2
生产环境只是一个配置文件的名称(它可以是任何有效的配置文件)。由于原始问题询问如何将活动配置文件设置为生产环境,所以我在答案中提到了这个。 - PaulNUK

30

添加--spring.profiles.active=production

示例:

java -jar file.jar --spring.profiles.active=production

2
这对我来说是解决方案。之前,我尝试过 java -jar file.jar -Dspring.profiles.active=production,但对我无效。 - Valentin Grégoire
8
如果您对"-D"参数形式感兴趣,那么它应该像下面这样在前面:java -Dspring.profiles.active=production -jar file.jar - Jaya Naresh
实际上,对我来说使用-D也不起作用,但是使用--spring.profiles.active作为命令行参数可以。 - Raid

24
首先,需要理解以下解决方案,始终会读取Spring Boot的application.properties文件。因此,其它配置文件仅会补充和替换之前定义过的属性。
考虑以下文件:
application.properties
application-qa.properties
application-prod.properties

1)非常重要。 application.properties 文件,只有这个文件,必须有以下行:

spring.profiles.active=@spring.profiles.active@

2) 修改QA和PROD配置文件中想要更改的内容,以查看环境之间的区别。

3) 通过命令行,使用以下任何选项启动spring boot应用程序:

它将使用默认的application.properties文件启动应用程序:

mvn spring-boot:run
它将加载默认的application.properties文件,然后加载application-qa.properties文件,替换和/或补充默认配置。
mvn spring-boot:run -Dspring.profiles.active=qa

同样的情况,只不过使用生产环境而不是QA:

mvn spring-boot:run -Dspring.profiles.active=prod

对于这个解决方案,不需要更改Java文件。 - Rafael S. Fijalkowski

13

在设置 Java 的 spring.profiles.active 时,我们也遇到了类似的问题。

在尝试四种不同的提供 spring.profiles.active 的方式后,最终我们弄明白了以下内容。

Java-8 中:

$ java --spring.profiles.active=dev -jar my-service.jar
Gives unrecognized --spring.profiles.active option.

$ java -jar my-service.jar --spring.profiles.active=dev
# This works fine

$ java -Dspring.profiles.active=dev -jar my-service.jar
# This works fine

$ java -jar my-service.jar -Dspring.profiles.active=dev
# This doesn't works

Java 11 中,
$ java --spring.profiles.active=dev -jar my-service.jar
Gives unrecognized --spring.profiles.active option.

$ java -jar my-service.jar --spring.profiles.active=dev
# This doesn't works

$ java -Dspring.profiles.active=dev -jar my-service.jar
# This works fine

$ java -jar my-service.jar -Dspring.profiles.active=dev
# This doesn't works

注意: 如果您在application.properties文件中指定了 spring.profiles.active参数,则需要按照上述提到的方法相应地提供spring.config.locationspring.config.additional-location选项给java。


谢谢。对我来说,在Java 11上只需要使用你提到的命令就可以了:'java -Dspring.profiles.active=dev -jar my-service.jar'。 - sasynkamil

11
如果您正在使用Maven,我会这样做:
把“production”设置为您的默认配置文件:
<properties>
    <activeProfile>production</activeProfile>
</properties>

作为其他个人资料的示例:

<profiles>
    <!--Your default profile... selected if none specified-->
    <profile>
        <id>production</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <activeProfile>production</activeProfile>
        </properties>
    </profile>

    <!--Profile 2-->
    <profile>
        <id>development</id>
        <properties>
            <activeProfile>development</activeProfile>
        </properties>
    </profile>

    <!--Profile 3-->
    <profile>
        <id>otherprofile</id>
        <properties>
            <activeProfile>otherprofile</activeProfile>
        </properties>
    </profile>
<profiles>

在您的application.properties文件中,您需要进行以下设置:

spring.profiles.active=@activeProfile@

每次这种方法都能解决我的问题,希望它也能解决你的问题。


1
请注意 - 要使用配置文件,请使用 maven package -P{配置文件名称} 命令,例如,对于基于生产环境的配置文件,请使用maven package -Pproduction - Artegon
这个程序会自动工作吗?不需要在运行时指定配置文件吗?就像上面Artegon提到的那样。这个程序真的可以将activeByDefault设置为true,而不需要从命令行传递配置文件吗?对我来说,使用activeByDefault并没有起作用。 - Indrajeet Gour
有没有想法如何使用yml实现这个?似乎不起作用。 - Jackie
@Jackie - 请查看 https://dev59.com/bVoU5IYBdhLWcg3wM1C9#66631458 - Joman68
我们如何实现只有活动的属性文件才会成为最终的JAR包的一部分呢?在我们的情况下,开发配置文件中包含了敏感的凭证信息(例如客户端ID和客户端密钥),我不想将其暴露给客户。是否有一种根据活动的Maven配置文件来排除属性文件的方法呢? - Walnussbär
找到了解决我的问题的方法:https://dev59.com/qLLma4cB1Zd3GeqPe7TD - Walnussbär

11

我用这种方式来做

    System.setProperty("spring.profiles.default", "dev");

main(...)函数的最开始


3
个人而言,我更喜欢引用常量org.springframework.core.env.AbstractEnvironment.DEFAULT_PROFILES_PROPERTY_NAME,而不是它的值。 - Ilya Serbis

9
将以下内容放入App.java中:
public static void main(String[] args) throws UnknownHostException {
    SpringApplication app = new SpringApplication(App.class);
    SimpleCommandLinePropertySource source = new SimpleCommandLinePropertySource(args);
    if (!source.containsProperty("spring.profiles.active") &&
            !System.getenv().containsKey("SPRING_PROFILES_ACTIVE")) {

        app.setAdditionalProfiles("production");
    }
    ...
}

这就是在JHipster中的实现方法。


可以通过编程方式在 AWS Lambda 中设置配置文件。谢谢! - LeOn - Han Li

2

如果您正在使用AWS Lambda和SprintBoot,则必须在环境变量下声明以下内容:

键:JAVA_TOOL_OPTIONS & 值:-Dspring.profiles.active=dev


2

在不改变源代码的情况下,实现这一点的简洁方法是使用操作系统环境变量SPRING_PROFILES_ACTIVE

export SPRING_PROFILES_ACTIVE=production

如何设置活动的Spring配置文件


2
如果您正在使用 application.yml 进行配置,则可以将以下内容添加到其中,以设置默认的活动配置文件:
spring:
  profiles:
    active: production

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