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

Posted

技术标签:

【中文标题】在 Spring Boot 中从命令行设置活动配置文件和配置位置【英文标题】:Setting active profile and config location from command line in spring boot 【发布时间】:2015-09-11 08:18:03 【问题描述】:

我有一个 Spring Boot 应用程序。

我的应用程序中有三个配置文件-> 开发、登台和生产。所以我有3个文件

    application-development.yml application-staging.yml application-production.yml

我的 application.yml 位于 src/main/resources 中。我已将 application.yml 中的活动配置文件设置为:

spring:
  profiles.active: development

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

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

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

但是,命令行属性没有得到反映,我的活动配置文件总是被设置为开发(这是我在 applications.yml 文件中提到的那个)。此外,不会在 C:\Config 文件夹中搜索配置文件特定的配置文件。

我想我在这里遗漏了一些东西。在过去的两天里,我一直试图弄清楚。但没有运气。非常感谢任何帮助。

【问题讨论】:

能否请您也添加您的bootRun 命令行 我是从 Eclipse 运行它,而不是命令行。但我尝试使用“gradle bootRun -Dspring.config.location=C:\Config\ -Dspring.profiles.active=staging”运行并得到相同的结果。 【参考方案1】:

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

选项 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

【讨论】:

-D 参数的顺序真的很重要:) 在部署 tomcat 容器时如何实现这一点?在那种情况下,我只是将我的战争放在 tomcat 的 webapps 文件夹中,我如何提供配置文件信息?通过设置系统属性? @prayagupd 是的,您可以在 bash_profile 中设置系统属性。 @maneesh 是的,我正在使用env variable SPRING_PROFILES_ACTIVE 通过~/.bash_profile 导出。 export SPRING_PROFILES_ACTIVE=e2e 当你说顺序很重要时:我们可以传入两个参数:-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【参考方案2】:

我的最佳实践是将其定义为 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 ? (弹簧 1x 和弹簧 2x)! @smilyface 弹簧靴。 spring boot 也有不同的版本:mvnrepository.com/artifact/org.springframework.boot/spring-boot 我用的是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 此答案的文档:docs.spring.io/spring-boot/docs/current/maven-plugin/reference/…【参考方案3】:
-Dspring.profiles.active=staging -Dspring.config.location=C:\Config

不正确。

应该是:

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

【讨论】:

这会导致错误“无法识别的选项:--spring.config.location” -D 是设置 Java System 属性的正确方法。 --something 是一个 bash 参数。 --spring.profiles.active 为我工作,我从 docs.spring.io/spring-boot/docs/current/reference/html/… 提到的同样的事情 这也适用于我在 Eclipse 中使用 Run As -> Java Application 其实两者都是正确的,这取决于它的使用方式:可以是java -Dspring.profiles.active=staging -Dspring.config.location=C:\Config your-spring-boot-app.jarjava your-spring-boot.jar --spring.profiles.active=staging --spring.config.location=C:\Config【参考方案4】:

我必须添加这个:

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 的指点。

【讨论】:

这可以更简单,如下所示:bootRun systemProperties = System.properties 。该命令会将所有使用-D开关传递的参数复制到systemProperty映射中。 这似乎是一个 gradle only 解决方案,没有通用解决方案吗? 你到底在哪里添加这个? build.gradle 文件中的任何位置或文件中的特定位置? @user1767316 你可以使用 SPRING_PROFILES_ACTIVE=profile 设置环境变量,就像一个魅力【参考方案5】:

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

例如:

SPRING_PROFILES_ACTIVE=dev gradle clean bootRun

参考:How to set active Spring profiles

【讨论】:

是的,这避免了 Gradle 将系统属性传递给应用程序的方式。 这是一种简洁的方式。它还应该用于设置数据库用户和密码以及其他敏感配置,以免它们在版本控制中被检查。【参考方案6】:

您可以使用以下命令行:

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

【讨论】:

【参考方案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"

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

【讨论】:

已更改为mvn spring-boot:run -Dspring-boot.run.profiles=foo,bar,请参阅:docs.spring.io/spring-boot/docs/current/maven-plugin/examples/… @rwenz3l 谢谢!这对我有用,只是将一个项目从 Spring Boot 1 升级到 2。现在我只需将它们全部添加到我的 bashrc 中...springmvn="mvn clean spring-boot:run -Dspring.profiles.active=local -Dspring-boot.run.profiles=local"【参考方案8】:

我认为您的问题可能与您的 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\ 时也会给我同样的问题。即使是活跃的个人资料也没有得到反映。我认为由于某种原因我的命令行没有被忽略。 您应该按照这个问题中给出的建议将参数传递给 bootRun ***.com/questions/25079244/… 谢谢。这真的很有帮助。【参考方案9】:

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

很多人提到-D 是指定JVM 参数的正确方法,您是绝对正确的。但正如 Spring Boot Profiles 文档中提到的那样,Michael 也是正确的。

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

【讨论】:

【参考方案10】:

我在 intellij 上执行此操作的一种方法是在命令上设置一个环境变量,如下所示:

在这种情况下,我将配置文件设置为测试

【讨论】:

【参考方案11】:

我们希望根据spring.profiles.active 中提到的配置文件名称和-Dspring.config.location 中的路径自动选择属性文件

application-dev.properties

如果我们在 Unix OS 中运行 jar,那么我们必须在 -Dspring.config.location 的末尾使用 /,否则会出现以下错误。

错误 :: java.lang.IllegalStateException:任何 PropertySourceLoader 都不知道配置文件位置“file:/home/xyz/projectName/cfg”的文件扩展名。如果该位置是为了引用一个目录,它必须以'/'结尾

示例

java -Dspring.profiles.active=dev -Dspring.config.location=/home/xyz/projectName/cfg/ -jar /home/xyz/project/abc.jar

java -jar /home/xyz/project/abc.jar --spring.profiles.active=dev --spring.config.location=/home/xyz/projectName/cfg/

【讨论】:

【参考方案12】:

帮我在个人资料位置的末尾添加“/”。

java -jar myjar.jar --spring.config.additional-location=env/ --spring.profiles.active=prod

【讨论】:

【参考方案13】:

如果你使用 Gradle:

-Pspring.profiles.active=local

【讨论】:

以上是关于在 Spring Boot 中从命令行设置活动配置文件和配置位置的主要内容,如果未能解决你的问题,请参考以下文章

spring.profiles.include 不适用于命令行参数

使用 maven 插件设置时 Spring Boot 配置文件不活动

如何根据 Spring Boot 中的活动配置文件设置注释属性值?

如何为 Spring Boot 应用程序的 gradle 构建设置活动配置文件?

Spring Boot 在命令行指定主类启动程序

无法在 spring-boot 应用程序中从 Consul 读取配置