如何在IntelliJ中运行时激活Spring Boot配置文件?

298

我有5个环境:

 - local (my development machine)
 - dev
 - qc
 - uat
 - live
 - staging

我希望在每个不同的环境中使用不同的应用程序属性,因此我有以下属性文件,每个文件都有数据源的不同URL:

 - application.properties  (containing common properties)
 - application-local.properties
 - application-dev.properties
 - application-qc.properties
 - application-uat.properties
 - application-live.properties

我正在使用IntelliJ在本地机器上通过Gradle插件中的bootRun运行我的应用程序。我将在所有运行Tomcat的其他环境上部署相同的应用程序war文件。

我尝试添加:

--spring.profiles.active=local

到脚本参数下的运行配置中。

我尝试添加:

-Dspring.profiles.active=local

到VM选项下的运行配置中。

两者都不起作用。我继续看到启动时的INFO消息说:没有设置活动配置文件,降级到默认配置文件:default。

如果我从Windows命令行运行我的应用程序:

gradle bootRun

但是我首先设置了环境变量

set SPRING_PROFILES_ACTIVE=local

那么一切都正常了。

所以我的问题是,当我从IntelliJ运行bootRun时,如何激活本地的spring boot配置文件?


1
你为什么要通过gradle来运行应用程序呢?使用运行配置不是更方便10倍吗?有一个字段可以设置要启用的配置文件... - Stephane Nicoll
1
我正在使用IntelliJ中的运行配置,就像上面解释的那样。但它没有起作用。 - dleerob
2
不,你不是。我所说的是“Spring Boot运行配置”,运行->编辑配置>新建>Spring Boot。 - Stephane Nicoll
啊,是的,我放弃了Spring Boot运行配置,因为我需要在我的build.gradle中将project.properties扩展到application.properties中,如果我使用Spring Boot运行配置,它似乎不起作用。我会尝试解决这个问题,然后也许我可以像你建议的那样简单地使用活动配置字段。 - dleerob
1
使用Spring Boot配置似乎比它的价值更麻烦。'Make'只是简单地复制资源,而不像构建脚本那样过滤/修改它们。然后告诉它从gradle而不是'make'运行'build'只会导致运行冻结。如果我改用bootRun,并按照下面的答案设置环境条目,一切都正常。 - dleerob
完成了,尽管我最初在2016年尝试过,正如我在原帖中提到的那样,当时它并没有起作用。不管问题是什么,现在肯定已经解决了。 - dleerob
18个回答

440

我在VM选项中添加了-Dspring.profiles.active=test,然后重新运行该配置。它完美地工作了。

可以通过以下步骤进行设置:

  • 选择 Run | Edit Configurations...
  • 转到 Configuration 选项卡
  • 展开 Environment 部分以显示 VM options

3
这对我也不起作用。我使用Gradle和两个模块(API和UI)。 - Virkom
3
我这里也不起作用,也在使用gradle。 - IARI
2
嗨,我也遇到了同样的问题,但是这个修复方法并没有解决问题。在这里重新运行配置是什么意思?只是重新运行任务吗? - user1456110
2
通常情况下,spring.profiles.include 更可取,因为 spring.profiles.active 也会禁用其他配置文件。停用默认配置文件可能是不希望的。 - Christian
2
@HibaHasan 你真是救了我的一天 - undefined
显示剩余6条评论

136
如果你实际上使用Spring Boot运行配置(目前仅在Ultimate Edition中支持),那么在“Active Profiles”设置中预先配置配置文件是很容易的。

enter image description here


2
谢谢,我相信这会起作用,但是我没有使用Spring Boot运行配置,我正在使用Gradle运行配置,它没有“Active Profiles”字段。我的gradle构建会过滤和修改一些属性文件,并将其复制到构建目录中,因此我正在使用Grade运行配置。 - dleerob
正如上面的答案所指出的那样:如果这对你不起作用,请确保在Application.main()中传递了args,例如SpringApplication.run(Application.class, args); - Xaero Degreaz
4
此功能仅受Ultimate版支持。 - Julien Malige
感谢@JulienMalige指出这一点。我会编辑我的回答。 - Daniel Bubenheim
你可以使用逗号分隔它们的列表,就像在命令行中一样,例如 default, staging。最右边的优先级最高,例如 foo=bar(默认)和 foo=baz(staging),将导致 foo=baz - 8bitme

73

使用IntelliJ Community版 2021.x进行测试

您可以创建多个配置,每个配置用于特定的配置文件。在我的情况下,我创建了一个名为dev config的配置,并设置了dev profile环境变量。

  1. 进入“Run > Edit Configuration”
  2. 在左侧“Application”下选择要编辑的配置。
  3. 在右侧>“Environment Variable”下,更新spring.profiles.active=<您的配置文件名称>,例如:spring.profiles.active=dev(注意:变量应该没有-D标志)
  4. 保存更改并使用相同的配置运行Spring Boot应用程序。

注意:您还可以在步骤2中使用同一面板中提供的选项创建新配置或复制现有配置。

输入图像描述


2
这个答案对我有用,我正在使用Spring Boot 2.4.2上的gradle bootRun配置,其他答案不会改变我的活动配置文件。谢谢! - Daniel Black
2
只有这个适用于非Spring Boot应用程序。 - Stan

47

随着Spring Boot的发展,它似乎改变了读取VM选项的方式。以下是在Intellij中启动应用程序并想要激活某些配置文件时尝试的一些方法:

1. 更改VM选项

在“运行”中打开“编辑配置”,并在“VM选项”中添加:-Dspring.profiles.active=local

这实际上在我自己的一个项目中使用Spring Boot v2.0.3.RELEASESpring v5.0.7.RELEASE工作正常,但在另一个项目中使用Spring Boot v2.1.1.RELEASESpring v5.1.3.RELEASE不起作用。

此外,当使用Maven或JAR运行时,有人提到了以下内容:

mvn spring-boot:run -Drun.profiles=dev
或者
java -jar -Dspring.profiles.active=dev XXX.jar

(请查看这里:如何使用Spring Boot配置文件

2. 传递JVM参数

有一些地方提到,如果您指定了一些JVM选项,Spring会更改应用程序进程启动的方式;它会分叉另一个进程,并且不会传递收到的arg,所以这不起作用。唯一传递参数的方法是:

mvn spring-boot:run -Dspring-boot.run.jvmArguments="..."

再次强调,这是针对Maven的。

https://docs.spring.io/spring-boot/docs/current/maven-plugin/examples/run-debug.html

3. 设置(应用)环境变量

对于第二个项目,对我有效的方法是设置环境变量,就像某些答案中提到的那样:“编辑配置”-“环境变量”,然后:

SPRING_PROFILES_ACTIVE=local

3
环境变量实际上应该是 SPRING_PROFILES_ACTIVE - Josh M.
1
我在IDEA的“运行配置”中添加了“VM选项” , 例如“spring.profiles.active”,它可以正常工作。或许像你用的那种形式是在系统属性中全局使用的呢? - WesternGun
如果你将它添加到~/.profile或类似文件中,你必须使用SPRING_PROFILES_ACTIVE,因为sprng.profiles.active通常只作为命令行参数起作用。 - Josh M.
1
啊..所以你的意思跟我猜想的一样;真实系统环境而非只有应用环境。好的,我来进行编辑。 - WesternGun
此答案非常简洁和完整。 - absentia

18

尝试在您的build.gradle中添加此命令:

这里输入图片描述

因此,用于运行配置该形状的命令如下:

这里输入图片描述


对我来说不起作用。 - omerhakanbilici

11

对于Spring Boot 2.1.0及更高版本,您可以使用以下命令:

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


2
在您的命令行中将是 spring-boot:run -Dspring-boot.run.profiles=local - Mr. K.
使用 spring-boot:run 命令,这就是答案。 - kakabali

11

最终我在我的build.gradle文件中添加了以下内容:

bootRun {
  environment SPRING_PROFILES_ACTIVE: environment.SPRING_PROFILES_ACTIVE ?: "local"
}

test {
  environment SPRING_PROFILES_ACTIVE: environment.SPRING_PROFILES_ACTIVE ?: "test"
}

现在当从IntelliJ运行bootRun时,默认使用"local"配置文件。

在其他环境中,我们将仅在Tomcat中设置'SPRING_PROFILES_ACTIVE'环境变量。

我从这里的评论中获得了这个信息:https://github.com/spring-projects/spring-boot/pull/592


6
可能的原因是您没有将命令行参数传递到应用程序的主方法中。几周前我也犯了同样的错误。
public static final void main(String... args) {
    SpringApplication.run(Application.class, args);
}

谢谢您的回复和建议,但是我正在传递参数。 - dleerob
这实际上解决了我的问题。由于某种原因,当我使用Gradle创建项目时,它没有自动生成我的“Application”类,所以我根据记忆手动创建了它。我错过了“args”步骤,所以运行配置中的“Active Profiles”框不起作用 - 我必须在VM选项框中手动传递-Dspring.profiles.active - Xaero Degreaz

3
我使用Intellij社区版。 进入“运行/调试配置”>“运行程序”选项卡>“环境变量”>单击按钮“...”。添加: SPRING_PROFILES_ACTIVE = local spring.profiles.active

3

在我的情况下,我在IntelliJ的VM选项中使用了以下配置,但它没有捕获本地配置,但在重启IntelliJ后,它从IntelliJ中捕获了配置详细信息并且服务开始运行。

-Dspring.profiles.active=local

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