在春季引导中从命令行设置活动概要文件和配置位置

我有一个弹簧引导应用程序。

我有三个配置文件在我的应用程序-> 开发、分期和制作。我有3个文件

  1. application-development.yml
  2. application-staging.yml
  3. application-production.yml

我的application.yml位于src/main/resources中。我已经在应用程序中设置了活动配置文件。Yml为:

spring:
profiles.active: development

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

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

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

然而,命令行属性没有得到反映,我的活动概要文件总是被设置为开发(这是我在应用程序中提到的一个)。yml文件)。此外,C:\Config文件夹不会搜索配置文件特定的配置文件。

我想我遗漏了一些东西。过去两天我一直在想这件事。但运气不好。我非常感激你的帮助。

485968 次浏览

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

引用文档

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

< a href = " http://docs.spring。io / spring-boot / docs /经常/引用/ htmlsingle / # boot-features-external-config-application-property-files noreferrer“rel = > http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/ boot-features-external-config-application-property-files < / >

我必须补充一点:

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

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

不正确。

应该是:

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

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

很多人提到-D是指定JVM参数的正确方法,你是完全正确的。但是正如Spring Boot配置文件文档中提到的那样,Michael也是正确的。

在文档中不清楚的是,它是什么样的参数:--spring.profiles.active不是一个标准的JVM参数,所以如果你想在你的IDE中使用它,填写正确的字段(即程序参数)

有两种不同的方法可以在命令行上添加/覆盖spring属性。

选项1:Java系统属性(虚拟机参数)

重要的是,-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

您可以使用以下命令行:

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

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

我看过很多人的旅行,希望能有所帮助

还有另一种方法,即设置操作系统环境变量SPRING_PROFILES_ACTIVE

例如:

SPRING_PROFILES_ACTIVE=dev gradle clean bootRun

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

我的最佳做法是将其定义为VM "-D"论点。请注意弹簧靴之间的区别。X和2.x。

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

Spring-Boot 2。X(仅适用于maven)

-Dspring-boot.run.profiles=local

Spring-Boot 1.倍

-Dspring.profiles.active=local

maven的用法示例:

Spring-Boot 2.倍

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

如果你使用Gradle:

-Pspring.profiles.active=local

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

application-dev.properties

如果我们在Unix操作系统中运行jar,那么我们必须在-Dspring.config.location的末尾使用/,否则它将给出以下错误。

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

例子

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/

我在intellij上这样做的一种方法是在命令上设置一个环境变量,如下所示:

test setup on intellij

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

对我来说,帮助添加"/"在配置文件的末尾位置。

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

我在springboot的命令行中使用不同的配置文件运行测试时也遇到了类似的问题。我通过首先设置配置文件,然后运行测试命令来解决这个问题,如下所示:

步骤1:导出SPRING_PROFILES_ACTIVE=test(mac/linux)或SET SPRING_PROFILES_ACTIVE=test(windows)

Step2: ./gradlew test——tests "com.maersk.snd.integrationtest.IntegrationTestPOC"

以上命令可以像下面这样组合在一起:

export SPRING_PROFILES_ACTIVE=test &./gradlew test——tests "com.maersk.snd.integrationtest.IntegrationTestPOC"

就像一个插件,如果你在你的application.properties文件中有一个属性,你需要从另一个配置文件中覆盖这个属性,你可以使用下面的属性spring.config.additional-location(使用-D,因为你从命令行传递) 我们过去常常这样做,因为我们在jar中有一个application.properties,在每个服务器的配置文件夹中有一个外部application.properties,用于覆盖任何服务器特定的属性

这将解决你在windows上的问题:

mvn spring-boot:run -D"spring-boot.run.profiles"=env