Maven中forkCount默认值0时<value>!0</value>匹配异常问题咨询
你遇到的这个问题,核心在于Maven解析POM的顺序和Profile激活的时机,以及可能的默认激活配置冲突:
Profile激活时机早于当前POM属性加载:Maven在启动构建时,会先执行Profile激活逻辑,之后才会加载当前POM里
<properties>块定义的属性。所以你直接运行mvn run_tests时,<forkCount>0</forkCount>这个值在Profile激活阶段根本还没被读取到,此时forkCount属性对激活逻辑来说是“不存在”的。默认激活的Profile抢占了优先级:如果你的
parallel-executionProfile设置了<activeByDefault>true</activeByDefault>,那么当no-parallel-execution因为属性不存在而无法激活时,parallel-execution就会默认生效,这就解释了为什么直接运行会触发插件B。而当你用-DforkCount=0传参时,系统属性forkCount存在且值为0,no-parallel-execution被激活,Maven会自动禁用所有activeByDefault的Profile,所以此时插件A正常生效。
调整Profile的激活条件和属性定义方式,确保默认情况下能正确激活no-parallel-execution,具体配置如下:
1. 移除当前POM根节点的<properties>中的forkCount设置
把默认值的定义移到no-parallel-execution Profile内部,避免激活时机问题。
2. 修改no-parallel-execution Profile的激活条件
让它在**forkCount属性不存在**(默认情况)或者属性值等于0时激活,同时在Profile内设置默认的forkCount值:
<profile> <id>no-parallel-execution</id> <activation> <!-- 当forkCount属性值为0时激活 --> <property> <name>forkCount</name> <value>0</value> </property> <!-- 当forkCount属性不存在时激活(默认场景) --> <property> <name>!forkCount</name> </property> </activation> <properties> <forkCount>0</forkCount> </properties> <!-- 插件A的配置 --> <build> <plugins> <plugin> <groupId>xxx</groupId> <artifactId>plugin-A</artifactId> <!-- 插件A的具体配置 --> </plugin> </plugins> </build> </profile>
3. 修改parallel-execution Profile的激活条件
只在forkCount属性存在且值不等于0时激活,不要设置<activeByDefault>true</activeByDefault>:
<profile> <id>parallel-execution</id> <activation> <property> <name>forkCount</name> <value>!0</value> </property> </activation> <!-- 插件B的配置 --> <build> <plugins> <plugin> <groupId>xxx</groupId> <artifactId>plugin-B</artifactId> <!-- 插件B的具体配置 --> </plugin> </plugins> </build> </profile>
验证效果
- 执行
mvn run_tests:forkCount属性不存在,激活no-parallel-execution,使用插件A; - 执行
mvn -DforkCount=0 run_tests:forkCount值为0,激活no-parallel-execution,使用插件A; - 执行
mvn -DforkCount=5 run_tests:forkCount值不等于0,激活parallel-execution,使用插件B。
这样就完全符合你的预期需求了。
内容的提问来源于stack exchange,提问作者Zack

