Gradle无法从Nexus拉取依赖,Jenkins构建报308重定向错误求助
兄弟,这个问题我之前帮团队排查过好几次,核心原因其实很明确:Maven没正确处理Nexus返回的308永久重定向,反而把重定向的HTML页面当成POM文件解析,而那个页面里的<hr>标签是HTML5的写法(未闭合),但Maven用严格的XML解析器处理,直接就报错了。
下面是一步步的解决方案,按顺序试应该能搞定:
先检查仓库URL的末尾斜杠
这是最常见的坑!很多人配置Nexus仓库URL的时候会漏掉末尾的/,比如写成http://<service>/repository/maven-public而不是http://<service>/repository/maven-public/。Nexus收到不带斜杠的请求时,会返回308重定向到带斜杠的地址,但Maven的默认配置不会自动跟随这个重定向,直接把重定向的HTML页面存进缓存了。
去这几个地方修改:- Jenkins任务的Maven配置里的仓库地址
- 项目
pom.xml里的<repository>/<pluginRepository>标签
改完之后先清缓存再构建。
强制Maven跟随重定向
如果改URL没用,给Maven加启动参数强制它处理重定向。在Jenkins的构建命令里加上:-Dmaven.wagon.http.followRedirects=true -Dmaven.wagon.http.retryHandler.count=3完整命令示例:
mvn clean deploy -Dmaven.wagon.http.followRedirects=true -Dmaven.wagon.http.retryHandler.count=3
第一个参数让Maven的wagon组件自动跟随HTTP重定向,第二个参数增加重试次数,防止偶发的网络问题。清理无效缓存
你已经发现缓存里存了那个错误的HTML页面,必须先清掉:- 在Jenkins代理机器上,找到Maven本地仓库(一般是
/home/jenkins/.m2/repository),删除对应依赖的目录:rm -rf /home/jenkins/.m2/repository/mt/com/bbb/xx/xx-commons/0.0.9 - 或者在Jenkins构建前加一个步骤,执行
mvn clean install -U,-U参数会强制更新依赖,同时清理本地缓存里的无效文件。
- 在Jenkins代理机器上,找到Maven本地仓库(一般是
验证重定向是否正常
改完之后先在代理机器上用wget测试,加上-L参数让它跟随重定向:wget -L http://<url>/repository/maven-public/mt/com/xx/yy/0.0.9/yy-0.0.9.pom如果能下载到正常的POM文件(不是那个308的HTML页面),那Jenkins构建应该就没问题了。
如果以上都不行,那可能是Nexus或者前端反向代理(比如Nginx)的配置有问题,比如Nginx强制加了重定向但没考虑Maven的兼容性,这时候就得调整代理的规则,或者给Nexus配置正确的base URL。
内容的提问来源于stack exchange,提问作者CptDolphin

