用 -p 参数激活 profile,后跟 profile id(如 -pdev),多个用逗号分隔;id 必须在 pom.xml 的 中明确定义且大小写严格匹配,仅含小写字母和短横线。

mvn 命令里怎么激活 profile
用 -P 参数,后面跟 profile id,多个用逗号分隔。不是 -D,也不是 --profile,更不是写在 settings.xml 里就自动生效。
-
mvn clean package -Pdev:激活 id 为dev的 profile -
mvn install -Ptest,with-docker:同时激活两个 profile - 如果 profile 设置了
activation且含activeByDefault=true,不加-P也会生效——但命令行显式指定会覆盖它 - 注意大小写:
-PDev和-Pdev是两个不同 profile
profile 在 pom.xml 里怎么写才被 -P 识别
必须有 id 字段,且值和命令行传入的完全一致;id 不能含空格、特殊字符,建议只用小写字母+短横线。
- 正确写法:
<profile> <id>prod</id> <properties> <env.url>https://api.example.com</env.url> </properties> </profile> - 错误写法:
<id>production env</id>(含空格)、<id>PROD</id>(大小写不匹配)、<id>prod</id>但没放在<profiles></profiles>根节点下 - 别把
<activation></activation>里的<jdk></jdk>或<os></os>当成触发条件来依赖——-P是强制激活,不管 activation 规则是否满足
为什么 -P 指定了 profile,但 properties 还是没生效
常见原因是 property 被其他地方覆盖了:比如父 pom 定义了同名 property、命令行又用了 -D、或者 resource filtering 没开。
- 检查 property 是否在
<properties></properties>下直接定义,而不是藏在<plugin></plugin>配置里 - 确认 resource 插件开启了 filtering:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.3.1</version> <configuration> <filtering>true</filtering> </configuration> </plugin> - 运行时用
mvn help:effective-pom -Pprod看最终合并后的 pom,确认 property 确实被注入进去了 - 避免在 profile 外层再定义同名 property——Maven 不做“覆盖优先级”提示,静默取第一个
spring-boot 项目里 profile 和 Maven profile 是两回事
这是最容易混淆的点:-P 控制的是 Maven 构建时的行为(比如替换配置文件、跳过测试),不是 Spring Boot 启动时的 --spring.profiles.active=prod。
- Maven profile 可以用来拷贝不同的
application-prod.yml到 target/classes,但它本身不会让 Spring 加载那个 profile - 如果想让打包后的 jar 默认启用某 profile,得在
pom.xml的 profile 里加:<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <jvmArguments>-Dspring.profiles.active=prod</jvmArguments> </configuration> </plugin> - 或者更稳妥的做法:用 Maven profile 控制资源过滤,生成带正确
application.yml的包,再靠外部参数启动











