Maven升级后无法将制品发布至Release仓库问题求助
将项目Maven从3.3.9升级到3.9.6(测试3.6.3也存在相同问题)后,执行maven-release-plugin发布命令时,Docker制品无法推送到指定的Release仓库,反而指向Snapshot仓库。DEBUG日志显示,旧版Maven下docker-maven-plugin生成的newName是正确的Release仓库地址,新版Maven下则为Snapshot仓库地址。
执行的发布命令
mvn -U -s ${MVN_SETTINGS} release:prepare release:perform -DreleaseVersion=${params.RELEASE_VERSION} -DdevelopmentVersion=${nextDevVer} -DtagNameFormat='@{version}' -DscmCommentPrefix='${commitPrefix}'
pom.xml相关配置
属性配置
<version.plugin.docker>1.2.2</version.plugin.docker> <version.plugin.surefire>2.22.2</version.plugin.surefire> <dockerio.server.id>docker-releases</dockerio.server.id> <dockerio.registry.url /> <docker.opt.root>/my/dir</docker.opt.root> <docker.base.java.version>17-slim</docker.base.java.version> <docker.registry>docker-snapshot.my.repo</docker.registry> <docker-release.registry.prefix>docker-release.my.repo</docker-release.registry.prefix> <debian.version>11-slim</debian.version> <docker.base.java.version>17</docker.base.java.version> <docker.base.java.image>${docker-release.registry.prefix}/repo/debian/${debian.version}/java-jre:${docker.base.java.version}</docker.base.java.image> <docker.server.id>docker-releases</docker.server.id> <docker.registry.prefix>${docker.registry}</docker.registry.prefix> <docker.registry.url /> <docker.src.dir>src/main/docker</docker.src.dir> <docker.filtered.dir>${project.build.directory}/docker</docker.filtered.dir> <docker.image.name>${project.artifactId}</docker.image.name> <docker.fqdn.image.name>${docker.registry.prefix}/repo/${docker.image.name}:${project.version} </docker.fqdn.image.name>
docker-maven-plugin配置
<plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>${version.plugin.docker}</version> <configuration> <registryUrl>${docker.registry.url}</registryUrl> <serverId>${docker.server.id}</serverId> <dockerDirectory>${docker.filtered.dir}</dockerDirectory> <imageName>${docker.image.name}</imageName> </configuration> <executions> <execution> <id>build</id> <phase>install</phase> <goals> <goal>build</goal> <goal>tag</goal> </goals> <configuration> <image>${docker.image.name}</image> <newName>${docker.fqdn.image.name}</newName> <resources> <!-- Docker build has no access to files outside build context (which is dockerDirectory cfg entry). Therefore, we are copying result jar to that directory here using docker plugin. That approach does not require separate ADD entry in Dockerfile. --> <resource> <targetPath>${docker.opt.root}/deploy</targetPath> <directory>${project.build.directory}</directory> <include>${uber-jar.name}</include> </resource> </resources> </configuration> </execution> <execution> <id>push</id> <phase>deploy</phase> <goals> <goal>push</goal> </goals> <configuration> <imageName>${docker.fqdn.image.name}</imageName> </configuration> </execution> </executions> </plugin>
Release激活配置
<profile> <id>release</id> <activation> <property> <name>releaseVersion</name> </property> </activation> <properties> <docker.registry>docker-release.my.repo</docker.registry> </properties> </profile>
问题原因与解决方案
原因分析
Maven 3.5+版本对属性插值和profile激活时机做了调整,maven-release-plugin执行release:perform时基于tag构建,但release profile的激活条件releaseVersion属性在tag构建阶段未被正确传递,导致docker.registry仍使用默认Snapshot值,最终生成错误的镜像地址。同时旧版docker-maven-plugin(1.2.2)与新版Maven的属性插值逻辑兼容性不佳,无法正确解析更新后的属性。
解决步骤
显式激活release profile
在发布命令中强制指定激活release profile,确保属性覆盖生效:mvn -U -s ${MVN_SETTINGS} release:prepare release:perform -DreleaseVersion=${params.RELEASE_VERSION} -DdevelopmentVersion=${nextDevVer} -DtagNameFormat='@{version}' -DscmCommentPrefix='${commitPrefix}' -Prelease升级docker-maven-plugin版本
旧版1.2.2存在兼容性问题,建议升级至最新稳定版(如1.4.13),优化对新版Maven的属性处理逻辑:<version.plugin.docker>1.4.13</version.plugin.docker>调整属性插值方式
修改docker.fqdn.image.name的定义,使用project.properties确保属性在构建时重新解析:<docker.fqdn.image.name>${project.properties['docker.registry.prefix']}/repo/${docker.image.name}:${project.version}</docker.fqdn.image.name>传递profile参数至perform阶段
在release:prepare阶段添加参数,确保perform阶段继承profile激活状态:mvn -U -s ${MVN_SETTINGS} release:prepare -DreleaseVersion=${params.RELEASE_VERSION} -DdevelopmentVersion=${nextDevVer} -DtagNameFormat='@{version}' -DscmCommentPrefix='${commitPrefix}' -Darguments="-Prelease" mvn -U -s ${MVN_SETTINGS} release:perform -Darguments="-Prelease"
内容的提问来源于stack exchange,提问作者M Zal

