M1 Mac下不修改父POM禁用Spotify docker-maven-plugin的方法
问题
父POM配置如下:
<build> <pluginManagement> <plugins> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>${docker-maven-plugin.version}</version> </plugin> </plugins> </pluginManagement> <plugins> <!-- for docker --> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <configuration> ... </configuration> </plugin> </plugins> </build>
由于使用M1 Mac,Spotify的docker-maven-plugin构建Dockerfile时会报错,因此子POM改用fabric8的docker-maven-plugin,配置如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.groupExample</groupId> <artifactId>parent</artifactId> <version>1.0.0-SNAPSHOT</version> </parent> <build> <finalName>${project.artifactId}</finalName> <plugins> <!-- Docker maven plugin --> <plugin> <groupId>io.fabric8</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.40.3</version> <configuration> ... </configuration> <!-- activation --> <dependencies> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency> </dependencies> </plugin> </plugins> </build> </project>
执行mvn clean install docker:build docker:push命令时,Maven仍使用Spotify插件而非fabric8插件,导致构建失败。尝试过以下方案但均无效:
<plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <executions> <execution> <id>default</id> <phase>none</phase> </execution> </executions> <inherited>false</inherited> </plugin>
<configuration> <skip>true</skip> </configuration>
请问在不修改父POM的前提下,如何在M1 Mac上完成Dockerfile构建?
解决方案
以下几种方法可在不修改父POM的前提下解决问题:
1. 直接指定fabric8插件完整目标执行
由于两个插件的artifactId都是docker-maven-plugin,默认目标前缀均为docker,可通过完整插件坐标指定执行fabric8的插件:
mvn clean install io.fabric8:docker-maven-plugin:0.40.3:build io.fabric8:docker-maven-plugin:0.40.3:push
该方式直接指定插件的groupId、artifactId、版本和目标,完全绕过父POM中的Spotify插件。
2. 覆盖禁用Spotify插件并为fabric8插件设置唯一前缀
在子POM的<plugins>中先覆盖Spotify插件并禁用,同时为fabric8插件配置自定义目标前缀避免冲突:
<build> <finalName>${project.artifactId}</finalName> <plugins> <!-- 覆盖并禁用父POM的Spotify插件 --> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <configuration> <skip>true</skip> </configuration> <executions> <execution> <id>default</id> <phase>none</phase> </execution> </executions> </plugin> <!-- 配置fabric8插件并设置自定义前缀 --> <plugin> <groupId>io.fabric8</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.40.3</version> <configuration> <!-- 你的自定义配置 --> ... <goalPrefix>fabric8-docker</goalPrefix> </configuration> <dependencies> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency> </dependencies> </plugin> </plugins> </build>
之后使用自定义前缀执行命令:
mvn clean install fabric8-docker:build fabric8-docker:push
3. 在子POM中排除继承Spotify插件
通过<pluginManagement>在子POM中设置Spotify插件不被继承:
<build> <pluginManagement> <plugins> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>${docker-maven-plugin.version}</version> <inherited>false</inherited> </plugin> </plugins> </pluginManagement> <finalName>${project.artifactId}</finalName> <plugins> <!-- 配置fabric8插件 --> <plugin> <groupId>io.fabric8</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.40.3</version> <configuration> ... </configuration> <dependencies> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency> </dependencies> </plugin> </plugins> </build>
此时执行原命令mvn clean install docker:build docker:push就会自动使用fabric8的插件。
内容的提问来源于stack exchange,提问作者melontart
相关产品推荐
相关产品推荐

