在Spring Boot中从命令行设置活动配置文件和配置位置


163

我有一个Spring Boot应用程序。

我的应用程序中有三个配置文件-> 开发,暂存和生产。所以我有3个档案

  1. 应用程序开发
  2. application-staging.yml
  3. application-production.yml

我的application.yml驻留在内部src/main/resources。我在application.yml中将活动配置文件设置为:

spring:
  profiles.active: development

其他3个配置文件特定的配置文件位于C:\config文件夹中。

我正在使用gradle插件进行蚀。当我尝试执行“ bootRun ”时,我在eclipse中的gradle配置中将命令行参数设置为

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

但是,命令行属性没有得到反映,并且我的活动配置文件始终被设置为development(这是我在applications.yml文件中提到的内容)。此外,不会在C:\ Config文件夹中搜索特定于配置文件的配置文件。

我想我在这里错过了一些东西。在过去的两天里,我一直在努力解决问题。但是没有运气。我真的很感谢您的帮助。


能否请您添加bootRun命令行也
六必居Kunjummen

到目前为止,我是从eclipse而不是命令行运行它的。但是我尝试使用“ gradle bootRun -Dspring.config.location = C:\ Config \ -Dspring.profiles.active = staging”运行,并得到了相同的结果。
O-OF-N

Answers:


340

您可以通过两种方法在命令行上添加/覆盖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

45
-D参数的顺序非常重要:)
马丁

3
部署说tomcat容器时如何实现?在那种情况下,我只是把战争放在了tomcat的webapps文件夹中,如何提供个人资料信息?通过设置系统属性?
祈祷的人,2017年

@prayagupd是的,您可以在bash_profile中设置系统属性。
祝愿

2
@maneesh是的,我正在使用通过导出的env变量SPRING_PROFILES_ACTIVE~/.bash_profileexport SPRING_PROFILES_ACTIVE=e2e
祈祷合'17

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

25

我的最佳实践是将其定义为VM“ -D”参数。请注意Spring Boot 1.x和2.x之间的区别。

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

春季启动2.x

-Dspring-boot.run.profiles=local

春季启动1.x

-Dspring.profiles.active=local

Maven的示例用法:

春季启动2.x

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

春季启动1.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

你是说春季/春季靴子?(春季1x和春季2x)!
smilyface,

1
@smilyface春季靴子。春季靴也有不同版本:mvnrepository.com/artifact/org.springframework.boot/spring-boot
Sma Ma

2
我用的是spring-boot 2.1.3,-Dspring-boot.run.profiles=local没有用,-Dspring.profiles.active=local工作了。
刘东华

spring-boot 2.2.0:同时工作: -Dspring-boot.run.profiles-Dspring.profiles.active
Grigory Kislin

17

我必须添加以下内容:

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使用相同的键复制通过switch 传递的所有参数以进行systemProperty映射。
edufinn

这似乎只是一个解决方案,没有通用的解决方案吗?
user1767316

1
您到底要在哪里添加?在build.gradle文件中或文件中特定位置的任何地方?
Scala发烧友'18

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

是不正确的。

应该:

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

3
这会导致错误“无法识别的选项:--spring.config.location”
James Watkins,

-D是设置Java系统属性的正确方法。--something是bash参数。
Xdg '16

--spring.profiles.active为我工作,这是我从docs.spring.io/spring-boot/docs/current/reference/html
Pushkar

在Eclipse中使用运行方式-> Java应用程序时,这对我也有效
OlivierBoissé17

11
实际上两者都是正确的,这取决于使用方式:可以为java -Dspring.profiles.active=staging -Dspring.config.location=C:\Config your-spring-boot-app.jarORjava your-spring-boot.jar --spring.profiles.active=staging --spring.config.location=C:\Config
Dexter Legaspi

9

您可以使用以下命令行:

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

9

设置OS变量SPRING_PROFILES_ACTIVE是另一种方法。

例如:

SPRING_PROFILES_ACTIVE=dev gradle clean bootRun

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


是的,这避免了Gradle将系统属性传递给应用程序的麻烦。
ben3000 '18

这是整齐的方式。它还应用于设置数据库用户和密码以及其他敏感配置,以便在版本控制中不检查它们。
伊戈尔·多宁

7

通过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"

我看到这次旅行的人很多..希望它会有所帮助


1
已更改为mvn spring-boot:run -Dspring-boot.run.profiles=foo,bar,请参阅:docs.spring.io/spring-boot/docs/current/maven-plugin/examples/…–
rwenz3l

@ rwenz3l谢谢!它对我有用,只是将项目从Spring Boot 1升级到了2。现在我将它们全部添加到我的bashrc中... springmvn="mvn clean spring-boot:run -Dspring.profiles.active=local -Dspring-boot.run.profiles=local"
John Smith

5

我认为您的问题很可能与spring.config.location没有以“ /”结尾的路径有关。

引用文档

如果spring.config.location包含目录(而不是文件),则目录应以/结尾(并在加载之前附加spring.config.name生成的名称)。

http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config-application-property-files


感谢您指出。但是,当我运行-Dspring.profiles.active = staging -Dspring.config.location = C:\ Config \时,也会遇到相同的问题。即使活动的个人资料也没有得到反映。我认为由于某些原因我的命令行没有被传递。
O-OF-N

1
您应该遵循这一问题给出的建议到ARGS传递给bootRun stackoverflow.com/questions/25079244/...
JST

谢谢。确实有帮助。
O-OF-N

4

迈克尔·殷的答案是正确的,但似乎需要更好的解释!

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

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.