Maven pom.xml profiles激活 命令行指定环境配置文件的参数

1次阅读

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

Maven pom.xml profiles激活 命令行指定环境配置文件的参数

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 的包,再靠外部参数启动

实际用的时候,profile 的 id 命名、property 名称、resource filtering 开关、以及和 Spring Boot 的衔接方式,这四点只要错一个,就会发现“明明指定了 -P,配置就是不对”。

text=ZqhQzanResources