Gradle拉取ManifestClasspath未使用指定Maven仓库报错如何解决?
问题原因
你遇到的501报错是因为Maven中央仓库早已停止支持HTTP协议访问,同时Gradle查找buildscript类依赖时,会按照repositories列表的声明顺序依次检索,你把HTTP协议的Maven中央仓库地址放在了Gradle官方插件仓库的前面,所以检索ManifestClasspath插件时会优先访问这个已失效的HTTP地址,还没轮到后面的插件仓库就触发了报错。
解决方案
方案一:简化仓库配置(推荐)
你单独声明的http://repo.maven.apache.org/maven2仓库完全可以直接删除,mavenCentral()的默认地址就是这个仓库的HTTPS版本,同时把Gradle插件仓库移到列表靠前位置,优先检索插件类依赖,修改后的配置如下:
buildscript { repositories { mavenLocal() // 插件仓库移到最前,优先拉取插件依赖 maven { url "https://plugins.gradle.org/m2/" } mavenCentral() jcenter() } dependencies { // 原有依赖配置保持不变 classpath("org.springframework.boot:spring-boot-gradle-plugin:$springBootVersion") classpath "org.owasp:dependency-check-gradle:$dependencyCheckVersion" classpath("org.springframework.cloud:spring-cloud-contract-gradle-plugin:${springCloudContractVersion}") classpath("org.springframework.cloud:spring-cloud-contract-pact:${springCloudContractVersion}") classpath "gradle.plugin.ua.eshepelyuk:ManifestClasspath:1.0.0" } }
方案二:显式指定依赖的拉取仓库
如果因为项目特殊要求不能调整仓库顺序,可以用Gradle的仓库内容过滤功能,指定ManifestClasspath插件仅从官方插件仓库拉取,不会去其他仓库检索:
buildscript { repositories { mavenLocal() mavenCentral() jcenter() maven { url "https://repo.maven.apache.org/maven2" } maven { url "https://plugins.gradle.org/m2/" // 仅从当前仓库拉取该分组下的依赖 content { includeGroup "gradle.plugin.ua.eshepelyuk" } } } // dependencies配置保持不变 }
如果你的Gradle版本支持plugins块声明,也可以直接用插件ID声明,不需要手动添加classpath依赖:
plugins { id "ua.eshepelyuk.ManifestClasspath" version "1.0.0" apply false } // 子项目应用插件的逻辑保持不变即可
内容的提问来源于stack exchange,提问作者Midorina
相关产品推荐
相关产品推荐

