IntelliJ运行应用时实际生效的是哪个Maven Profile?
核心问题说明
你的配置存在两处错误
- 依赖scope配置错误:你在Dev Profile里给
spring-boot-starter-tomcat配置了<scope>provided</scope>,这个scope的作用是标记依赖仅参与编译、测试阶段,不会被加入运行时类路径。本地通过IDEA直接启动Spring Boot嵌入式容器的时候,JVM找不到Tomcat相关的类,自然启动失败。
注:provided scope的设计场景是打WAR包部署到外部Tomcat时使用——外部容器本身已经提供了Tomcat核心类,不需要应用包里再带一份嵌入式Tomcat造成类冲突,才会把这个依赖设为provided。本地用嵌入式Tomcat跑调试的场景,这个依赖必须用默认的
compilescope(也就是去掉scope标签,Maven默认scope就是compile),才能在运行时正常加载。
- 对IDEA的Profile生效逻辑理解有误:IDEA右侧Maven面板里的Profile勾选状态,仅对通过Maven面板执行的命令(比如package、install、deploy,或者手动执行mvn命令)生效,和右上角绿色运行按钮启动应用时的运行配置是两套独立的配置,不会自动同步。
IDEA点击运行按钮时实际生效的Maven Profile
默认情况下,如果你没有手动修改过启动类对应的运行/调试配置,只会激活pom.xml中标记了<activeByDefault>true</activeByDefault>的默认Profile,不会自动加载你在Maven面板勾选的Dev Profile。
要让Dev Profile在点击运行时生效,需要手动修改对应运行配置:
- 点击右上角运行配置下拉框,选择「编辑配置」
- 找到你用来启动Spring Boot的对应配置项,在配置页中找到Maven Profile相关的设置项,手动指定激活Dev Profile
- 更稳妥的调试方式是直接创建Maven类型的运行配置,执行命令
spring-boot:run -P dev,这种方式会严格按照-P参数指定的Profile加载依赖,不会出现配置不同步的问题
修正后的配置参考
Dev Profile下的Tomcat依赖去掉provided scope即可:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <!-- 删掉scope标签,默认compile scope,运行时可见 --> </dependency>
如果Prod环境是打WAR包部署外部Tomcat,可以在Prod Profile中配置该依赖为provided scope,或者直接排除该依赖,避免和外部容器的Tomcat包冲突。
配置修改完成后记得点击Maven面板的刷新按钮重新导入依赖,再启动应用即可正常运行。
内容的提问来源于stack exchange,提问作者microwth
相关产品推荐
相关产品推荐

