执行mvn clean install verify时build-image-no-fork意外触发问题
我照着Spring Boot官方文档配置了spring-boot-maven-plugin的build-image-no-fork目标,POM配置片段如下:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> <image> <name>registry.gitlab.com/${project.name}:${project.version}</name> </image> </configuration> <executions> <execution> <goals> <goal>build-image-no-fork</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
本来只想让这个镜像构建目标在执行mvn package的时候跑,但实际执行mvn clean install或者mvn verify时它也会自动启动,就算给execution加了phase配置也没搞定。
问题出在哪
Maven的生命周期是按顺序递进的:clean → validate → compile → test → package → verify → install → deploy。也就是说,install和verify阶段本身就会包含package阶段的所有任务。如果你的build-image-no-fork绑定到了package阶段,那执行后续阶段时自然会触发它。
另外,如果之前添加的phase配置没写对(比如没明确指定绑定到package,或者配置格式有误),也会导致达不到预期效果。
两种解决办法
方法一:用Maven Profile控制
定义一个专门的Profile,只有激活这个Profile时才会执行镜像构建:
<profiles> <profile> <id>build-image</id> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <id>build-image</id> <goals> <goal>build-image-no-fork</goal> </goals> <phase>package</phase> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles>
需要构建镜像时,手动激活Profile执行:
mvn package -Pbuild-image
这样平时执行mvn install或mvn verify时,只要不激活这个Profile,就不会触发镜像构建。
方法二:手动触发目标
不把插件绑定到任何生命周期阶段,需要构建镜像时再手动指定执行:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> <image> <name>registry.gitlab.com/${project.name}:${project.version}</name> </image> </configuration> <!-- 删掉原来的executions配置,不绑定到生命周期 --> </plugin> </plugins> </build>
需要构建镜像时,执行这条命令:
mvn package spring-boot:build-image-no-fork
这种方式完全由手动控制,不会在任何生命周期阶段自动触发。
多模块项目额外提醒
如果是多模块项目,一定要确保这个插件配置只在可执行的Spring Boot应用模块里生效,别在父模块或者其他非应用模块里重复配置,不然可能会出现不必要的触发。
内容的提问来源于stack exchange,提问作者iamsimonsmale

