在Spring Boot中,通过命令行设置活动配置文件和配置位置。

316
我有一个Spring Boot应用程序。
我的应用程序有三个配置文件->开发、暂存和生产。所以我有3个文件。
  1. application-development.yml
  2. application-staging.yml
  3. application-production.yml
我的application.yml文件位于src/main/resources目录下。我已在application.yml中设置了活动配置文件为:
spring:
  profiles.active: development

其他三个特定配置文件位于C:\config文件夹中。
我正在使用Eclipse的Gradle插件。当我尝试执行"bootRun"时,我在Eclipse的Gradle配置中设置了命令行参数。
 -Dspring.profiles.active=staging -Dspring.config.location=C:\Config

然而,命令行属性没有得到反映,我的活动配置始终被设置为开发环境(这是我在applications.yml文件中提到的那个)。此外,C:\Config文件夹没有被搜索以获取特定配置文件。
我觉得我在这里漏掉了什么。我已经试图弄清楚了过去两天。但是没有运气。我真的很感激任何帮助。

请问您能否添加您的 bootRun 命令行? - Biju Kunjummen
1
我一直是从Eclipse运行它,而不是从命令行运行。但是我尝试使用“gradle bootRun -Dspring.config.location=C:\Config\ -Dspring.profiles.active=staging”运行,结果一样。 - Vinod Mohanan
16个回答

605

您可以通过两种不同的方式在命令行上添加/覆盖Spring属性。

选项1:Java系统属性(VM参数)

重要的是,-D参数必须在您的application.jar之前,否则它们将无法被识别。

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

选项2:程序参数

java -jar application.jar --spring.profiles.active=prod --spring.config.location=c:\config

86
-D参数的顺序非常重要 :) - martin
4
在部署到Tomcat容器时,您如何实现这一点?在这种情况下,我只需将我的WAR包放入Tomcat的webapps文件夹中,那么我该如何提供配置文件信息呢?通过设置系统属性吗? - prayagupa
3
@maneesh 是的,我正在使用通过~/.bash_profile导出的环境变量SPRING_PROFILES_ACTIVEexport SPRING_PROFILES_ACTIVE=e2e - prayagupa
1
当你说顺序很重要时:我们可以同时传递两个参数:-Dspring.profile.active和-Dspring.config.location,以便根据第一个参数设置配置文件,并根据第二个参数选择属性文件吗? 例如:java -Dspring.profiles.active=$ENV -Dspring.config.location=file:///aws-secrets-manager/properties/application-$ENV.properties /code/app.jar - Pramod Setlur
2
直到我添加引号,选项1才对我起作用:java -jar -D"spring.profiles.active"=prod application.jar - Roeland Van Heddegem
显示剩余4条评论

64

我的最佳实践是将此定义为一个VM“-D”参数。请注意spring boot 1.x和2.x之间的差异。

可以在命令行上指定要启用的配置文件:

Spring-Boot 2.x(仅适用于maven)

-Dspring-boot.run.profiles=local

Spring Boot 1.x

-Dspring.profiles.active=local

使用Maven的示例:

Spring Boot 2.x

mvn spring-boot:run -Dspring-boot.run.profiles=local

Spring-Boot 1.x和2.x

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

对于多个配置文件,请确保用逗号分隔它们:

mvn spring-boot:run -Dspring.profiles.active=local,foo,bar
mvn spring-boot:run -Dspring-boot.run.profiles=local,foo,bar

你是指 Spring / Spring Boot 吗?(Spring 1.x 和 Spring 2.x)! - smilyface
1
@smilyface Spring Boot。Spring Boot也有不同的版本可用:https://mvnrepository.com/artifact/org.springframework.boot/spring-boot - Sma Ma
4
我使用的是spring-boot 2.1.3版本, -Dspring-boot.run.profiles=local 没有生效,而 -Dspring.profiles.active=local 生效了。 - Donghua Liu
Spring Boot 2.2.0:同时支持“-Dspring-boot.run.profiles”和“-Dspring.profiles.active”。 - Grigory Kislin
2
此答案的文档:https://docs.spring.io/spring-boot/docs/current/maven-plugin/reference/htmlsingle/#run-example-active-profiles - Dawngerpony

35
-Dspring.profiles.active=staging -Dspring.config.location=C:\Config

不正确。

应该是:

--spring.profiles.active=staging --spring.config.location=C:\Config

3
这会导致错误:"Unrecognized option: --spring.config.location"。 - James Watkins
2
-D 是设置 Java 系统属性的正确方式。--something 是 Bash 参数。 - Xdg
--spring.profiles.active 对于我有用,这是我从 http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html 中引用的相同内容。 - Pushkar
当我在Eclipse中使用“Run As -> Java Application”时,这对我也有效。 - Olivier Boissé
21
实际上两种写法都是正确的,取决于使用场景:它可以是java -Dspring.profiles.active=staging -Dspring.config.location=C:\Config your-spring-boot-app.jar或者 java your-spring-boot.jar --spring.profiles.active=staging --spring.config.location=C:\Config - Dexter Legaspi

29

你可以通过设置操作系统(OS)环境变量SPRING_PROFILES_ACTIVE来实现另一种方式。

例如:

SPRING_PROFILES_ACTIVE=dev gradle clean bootRun

参考:如何设置活动的Spring配置文件


1
是的,这样可以避免在Gradle传递系统属性到应用程序时需要进行调整。 - ben3000
1
这是一种整洁的方式。它也应该被用来设置数据库用户和密码以及其他敏感配置,这样它们就不会被检查到版本控制中。 - Igor Donin

18

我不得不添加这个:

bootRun {
    String activeProfile =  System.properties['spring.profiles.active']
    String confLoc = System.properties['spring.config.location']
    systemProperty "spring.profiles.active", activeProfile
    systemProperty "spring.config.location", "file:$confLoc"
}

现在bootRun会选择配置文件和配置位置。

非常感谢@jst的指引。


7
这个命令可以更简单,如下所示:bootRun { systemProperties = System.properties }。此命令将把所有通过 -D 开关传递的参数与相同的键复制到 systemProperty 映射中。 - edufinn
1
这似乎是一个仅适用于Gradle的解决方案,难道没有通用的解决方案吗? - user1767316
2
你是在哪里添加这个?是在build.gradle文件的任何位置还是在文件中的特定位置? - Scala Enthusiast
@user1767316,你可以设置一个环境变量SPRING_PROFILES_ACTIVE=profile,非常好用。 - vinicius gati

10

您可以使用以下命令行:

java -jar -Dspring.profiles.active=[yourProfileName] target/[yourJar].jar

8

当通过Maven插件设置概要文件时,您必须通过run.jvmArguments进行设置。

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

开启调试选项:

mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 -Dspring.profiles.active=jpa"

我经常看到很多人困惑于此。希望这可以帮助你。


2
已更改为 mvn spring-boot:run -Dspring-boot.run.profiles=foo,bar,请参见:https://docs.spring.io/spring-boot/docs/current/maven-plugin/examples/run-profiles.html - rwenz3l
@rwenz3l 谢谢!这对我很有帮助。我刚刚将一个项目从Spring Boot 1升级到2。现在我只需将它们全部添加到我的bashrc中... springmvn="mvn clean spring-boot:run -Dspring.profiles.active=local -Dspring-boot.run.profiles=local" - John Smith

7

谢谢您指出这个问题。然而,当我运行-Dspring.profiles.active=staging -Dspring.config.location=C:\Config\时,也遇到了同样的问题。即使激活配置文件也没有反映出来。我认为由于某种原因我的命令行没有被传递过去。 - Vinod Mohanan
1
你应该遵循这个问题中给出的建议,将args传递给bootRun https://dev59.com/fV8f5IYBdhLWcg3wEPEq - jst
谢谢。那真的帮了很多。 - Vinod Mohanan

6
这将解决您在Windows上的问题:
mvn spring-boot:run -D"spring-boot.run.profiles"=env

它正在工作,谢谢。为什么mvn spring-boot:run -Dspring.profiles.active=env不起作用? - Vamsi Jayavarapu

5

Michael Yin的答案是正确的,但需要更好的解释!

你们中的许多人提到了-D是指定JVM参数的正确方式,你们绝对是正确的。但正如Spring Boot Profiles文档中所述,Michael也是正确的。

文档中不清楚的是它是什么类型的参数:--spring.profiles.active不是标准的JVM参数,因此如果您想在IDE中使用它,请填写正确的字段(即程序参数)。


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