【问题标题】:Configure active profile in SpringBoot via Maven通过 Maven 在 SpringBoot 中配置活动配置文件
【发布时间】:2017-07-12 11:09:54
【问题描述】:

我正在尝试使用 Maven 3 在 Spring Boot 应用程序中设置活动配置文件。
在我的 pom.xml 中,我将 default active profile 和属性 spring.profiles.active 设置为 development

<profiles>
    <profile>
        <id>development</id>
        <properties>
            <spring.profiles.active>development</spring.profiles.active>
        </properties>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
</profiles>

但每次我运行我的应用程序时,我都会在日志中收到以下消息:

No active profile set, falling back to default profiles: default

并且 SpringBoot 配置文件设置为默认值(读取 application.properties 而不是 application-development.properties)

我还应该怎么做才能使用 Maven 配置文件设置我的 SpringBoot 活动配置文件?
任何帮助都非常感谢。

【问题讨论】:

标签: java spring maven spring-boot


【解决方案1】:

您应该使用 Spring Boot Maven 插件

<project>  
  ...
  <build>
    ...
    <plugins>
      ...
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <version>1.5.1.RELEASE</version>
        <configuration>
          <profiles>
            <profile>foo</profile>
            <profile>bar</profile>
          </profiles>
        </configuration>
        ...
      </plugin>
      ...
    </plugins>
    ...
  </build>
  ...
</project>

【讨论】:

  • 更轻松、更快速、更清洁,不会磕头。为我 +1
【解决方案2】:

Maven 配置文件和 Spring 配置文件是两个完全不同的东西。您的 pom.xml 定义了 spring.profiles.active 变量,该变量在构建过程中可用,但在运行时不可用。这就是为什么只激活默认配置文件的原因。

如何将 Maven 配置文件与 Spring 绑定?

您需要将构建变量传递给您的应用程序,以便它在启动时可用。

  1. 在您的application.properties 中定义一个占位符:

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

    @spring.profiles.active@ 变量必须与 Maven 配置文件中声明的属性匹配。

  2. 在 pom.xml 中启用资源过滤:

    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
        …
    </build>
    

    执行构建时,src/main/resources 目录中的所有文件都将由 Maven 处理,application.properties 中的占位符将替换为您在 Maven 配置文件中定义的变量。

有关更多详细信息,您可以go to my post 我描述了这个用例。

【讨论】:

  • 有没有办法通过 maven 命令为单元测试启用配置文件?也许你对this question.有一个想法
  • 我只想补充一点,您可以使用 commamd mvn package -P myProfile 设置活动配置文件,其中我的配置文件在 POM 中定义
【解决方案3】:

您可以使用以下命令运行。这里我想使用spring profilelocal运行:

spring-boot:run -Drun.jvmArguments="-Dspring.profiles.active=local"

【讨论】:

  • 最佳答案!在 mac os 10.13.3 上使用 maven 3.5.2 + java 1.8 + spring-boot-1.5.9.RELEASE 为我工作
  • 我在哪里添加它?
【解决方案4】:

或者相当容易:

mvn spring-boot:run -Dspring-boot.run.profiles={profile_name}

【讨论】:

  • 虽然这没有回答“如何通过 maven 设置 springboot 活动配置文件”的问题,但它给了我“如何设置 springboot:运行活动配置文件”的答案。
  • 使用 Spring2.x,spring.profiles.active 设置不起作用,无论是直接还是通过 jvmArguments。感谢您的回答
【解决方案5】:

有多种方法可以为您的 springboot 应用程序设置配置文件。

  1. 你可以在你的属性文件中添加这个:

    spring.profiles.active=dev
    
  2. 程序化方式:

    SpringApplication.setAdditionalProfiles("dev");
    
  3. 测试可以很容易地指定哪些配置文件处于活动状态

    @ActiveProfiles("dev")
    
  4. 在 Unix 环境中

    export spring_profiles_active=dev
    
  5. JVM系统参数

    -Dspring.profiles.active=dev
    

示例:使用配置文件运行 springboot jar 文件。

java -jar -Dspring.profiles.active=dev application.jar

【讨论】:

  • >你可以在你的属性文件中添加这个:在哪个属性文件中?因为需要配置文件来获取相应的 application.xxx.properties
【解决方案6】:

在开发中,当激活特定的 Maven 配置文件时激活 Spring Boot 配置文件是直接的。您应该在 Maven 配置文件中使用 spring-boot-maven-plugin 中的 the profiles property,例如:

<project>
    <...>
    <profiles>
        <profile>
            <id>development</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-maven-plugin</artifactId>
                        <configuration>
                            <profiles>
                                <profile>development</profile>
                            </profiles>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
    <profiles>
    </...>
</project>

您可以运行以下命令来同时使用 Spring Boot 和 Maven development 配置文件:

mvn spring-boot:run -Pdevelopment

如果您希望能够将任何 Spring Boot 配置文件映射到具有相同配置文件名称的 Maven 配置文件,您可以定义一个 Maven 配置文件并在检测到存在 Maven 属性时启用它。此属性将是您在运行 mvn 命令时需要指定的唯一内容。
配置文件看起来像:

    <profile>
        <id>spring-profile-active</id>
        <activation>
            <property>
                <name>my.active.spring.profiles</name>
            </property>
        </activation>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <configuration>
                        <profiles>
                            <profile>${my.active.spring.profiles}</profile>
                        </profiles>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>

您可以运行以下命令来同时使用 Spring Boot 和 Maven development 配置文件:

mvn spring-boot:run -Dmy.active.spring.profiles=development

或:

mvn spring-boot:run -Dmy.active.spring.profiles=integration

或:

 mvn spring-boot:run -Dmy.active.spring.profiles=production

所以……

这种配置很有意义,因为在通用 Maven 配置文件中,您依赖传递的 my.active.spring.profiles 属性来执行某些任务或为某些事情赋值。
例如,我使用这种方式来配置一个通用的 Maven 配置文件,该配置文件将应用程序打包并构建一个特定于所选环境的 docker 映像。

【讨论】:

    【解决方案7】:

    我想在不同的环境中运行自动化测试。
    所以我将这个添加到命令 maven 命令中:

    spring-boot:run -Drun.jvmArguments="-Dspring.profiles.active=productionEnv1"
    

    这是我找到解决方案的链接:[1]https://github.com/spring-projects/spring-boot/issues/1095

    【讨论】:

    • mvn spring-boot:run -Drun:jvmArguments="-Dspring.profiles.active=prod" --> 当我运行这个时,我仍然得到No active profile set, falling back to default profiles: default
    【解决方案8】:

    如果您只想将其用于测试,我想澄清 Daniel Olszewski 的出色答案 https://stackoverflow.com/a/42391322/13134499

    如何将 Maven 配置文件与 Spring 绑定以进行测试

    1. 和你一样,在pom.xml中定义变量
    ...
    <properties>
      <spring.profiles.active>development</spring.profiles.active>
    </properties>
    
    1. application-test.properties 中的src/test/resources 中定义一个占位符:
    spring.profiles.active=@spring.profiles.active@
    
    1. 在你pom.xml中启用资源过滤:
    <build>
      ...
      <testResources>
        <testResource>
          <directory>src/test/resources</directory>
          <filtering>true</filtering>
        </testResource>
      <testResources>
    </build>
    

    【讨论】:

      【解决方案9】:

      文件结构:

      /src/main/资源

      =>

      application.properties:

      spring.profiles.active:@spring.profiles.active@'
      

      应用程序-dev.properties

      应用程序-prod.properties

      IDE-Eclipse:

      Right click on the project=>Run As=>Run Configuration=>Arguments=>VM Arguments:-Dspring.profiles.active=dev
      

      CMD:

      mvn spring-boot:run -Dspring.profiles.active=dev
      mvn clean install -Dspring.profiles.active=dev
      

      【讨论】:

        猜你喜欢
        • 2021-01-08
        • 2023-03-23
        • 2013-12-26
        • 2015-11-21
        • 2014-10-14
        • 2012-02-17
        • 2014-10-22
        • 2019-08-03
        • 1970-01-01
        相关资源
        最近更新 更多