多模块Maven项目中仅让扩展在父模块生效的配置方法
解决Maven多模块项目中扩展仅在父模块生效的问题
这问题我之前也碰到过——Maven默认会让父pom里的<build>配置(包括扩展)被子模块继承,所以你直接把扩展加在父pom的build里,子模块构建时自然也会执行它。不过有个挺优雅的解决办法:用Profile配合激活条件,让扩展只在父模块构建时生效。
核心解决方案:基于Packaging的Profile激活
Maven多模块的父模块通常packaging是pom,而子模块一般是jar/war这类可执行或可打包的类型。我们可以利用这个特性,给扩展配置套一个Profile,只在当前模块的packaging为pom时激活:
<profiles> <profile> <id>parent-only-extension</id> <!-- 仅当当前模块的packaging为pom时,自动激活该Profile --> <activation> <packaging>pom</packaging> </activation> <build> <extensions> <extension> <groupId>com.my.ext</groupId> <artifactId>extension</artifactId> <version>x.y.z</version> <!-- 替换成你的扩展实际版本 --> </extension> </extensions> </build> </profile> </profiles>
为什么这个方法能生效?
- 父模块的
packaging是pom,构建时这个Profile会自动激活,扩展正常加载执行; - 子模块的
packaging不是pom,所以这个Profile不会被激活,也就不会继承到扩展配置; - 不需要修改任何子模块的pom,维护成本极低。
进阶:精准匹配根父模块
如果你的项目存在嵌套的聚合模块(比如某个子模块也是pom打包的聚合模块),可以再加个更精准的激活条件,指定只有根父模块才加载扩展:
<activation> <property> <name>project.artifactId</name> <value>你的根父模块artifactId</value> </property> </activation>
这样就能确保只有你指定的根父模块才会执行这个扩展,其他子模块(哪怕是pom打包的子聚合模块)都不会触发。
内容的提问来源于stack exchange,提问作者Maxim Popov
相关产品推荐
相关产品推荐

