Maven版本范围优先选取SNAPSHOT而非Release版的解决方案咨询
Maven版本范围误选SNAPSHOT依赖的可行解决方案
注意:你当前父pom中定义的依赖版本范围为
[1.1.0, 1.2.0),属于左闭右开区间,1.2.0正式版本身不在该区间范围内,如果要纳入1.2.x的正式版,建议调整范围为[1.1.0, 1.3.0)或者[1.1.0, 1.2.0]。
方案1:调整Maven仓库配置,从源头屏蔽SNAPSHOT版本
这是最稳妥的绕过方案,完全避开对应Maven官方bug的影响:
- 可以在项目的
settings.xml中,对应远程仓库的配置里,将snapshots的enabled属性设为false:
<repository> <id>artifactory-release</id> <url>你的Artifactory正式版仓库地址</url> <snapshots> <enabled>false</enabled> </snapshots> <releases> <enabled>true</enabled> </releases> </repository>
- 也可以直接在Artifactory侧创建一个仅包含正式Release组件的虚拟仓库,构建时指定使用该仓库,完全过滤所有SNAPSHOT版本。
方案2:使用versions插件的use-latest-releases目标替代范围解析
不要依赖resolve-ranges的自动解析,直接用插件能力将依赖版本替换为区间内最新的正式版,固化版本号后再构建:
# 直接将com.someotherapp组下的所有依赖更新为最新正式版 mvn versions:use-latest-releases -f "myapp-service/pom.xml" -Dincludes=com.someotherapp:* -DallowSnapshots=false -DgenerateBackupPoms=true # 再执行构建 mvn clean install
该目标本身就会优先匹配正式版,不受版本范围解析bug的影响。
方案3:升级versions-maven-plugin到2.11.0+版本
旧版本的versions插件对allowSnapshots=false参数的处理存在缺陷,升级到2.11.0及以上版本后,在插件配置中显式声明该参数即可生效:
在父pom中添加插件配置:
<build> <pluginManagement> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>versions-maven-plugin</artifactId> <version>2.16.2</version> <configuration> <allowSnapshots>false</allowSnapshots> </configuration> </plugin> </plugins> </pluginManagement> </build>
再执行原有的resolve-ranges命令即可正确过滤SNAPSHOT版本。
内容的提问来源于stack exchange,提问作者Arun Kumar
相关产品推荐
相关产品推荐

