init.gradle 的错误配置导致 Gradle 构建失败
init.gradle 的错误配置导致 Gradle 构建失败
其中,init.gradle 文件存在于 Android Studio 中 File | Settings | Build, Execution, Deployment | Build Tools | Gradle > Gradle user home
所配置的文件目录下。
错误分析
使用 Android Studio 和 Gradle 构建 APP 时报错:
Caused by: org.gradle.api.InvalidUserCodeException: Using insecure protocols with repositories, without explicit opt-in, is unsupported. Switch Maven repository 'maven(http://maven.aliyun.com/nexus/content/repositories/jcenter)' to redirect to a secure protocol (like HTTPS) or allow insecure protocols. See https://docs.gradle.org/8.0.2/dsl/org.gradle.api.artifacts.repositories.UrlArtifactRepository.html#org.gradle.api.artifacts.repositories.UrlArtifactRepository:allowInsecureProtocol for more details.
这个错误表明在 Android Studio 项目中使用了不安全的协议访问 Maven 仓库。Gradle 8.0.2 版本引入了对不安全协议的默认禁用,因此需要采取一些措施来解决这个问题。
在 build.gradle
文件中,找到涉及 http://maven.aliyun.com/nexus/content/repositories/jcenter
的 Maven 仓库声明,并将其协议更改为安全的 HTTPS。例如, Maven 仓库声明可能如下:
maven {
url "http://maven.aliyun.com/nexus/content/repositories/jcenter"
}
应该将其修改为:
maven {
url "https://maven.aliyun.com/nexus/content/repositories/jcenter"
}
确保所有 Maven 仓库声明都使用了 HTTPS 协议。这样可以遵循 Gradle 8.0.2 版本的要求,同时确保依赖项能够成功下载。
如果项目中有多个 build.gradle
文件,要确保在所有相关的文件中都进行了相应的更改。
如果 Maven 仓库不提供 HTTPS 支持,可以联系仓库的管理员,询问是否有其他支持 HTTPS 协议的地址。如果没有其他选择,可能需要考虑使用其他支持 HTTPS 的 Maven 仓库。
错误纠正
-
错误的 init.gradle 配置:
allprojects{ repositories { def ALIYUN_REPOSITORY_URL = 'http://maven.aliyun.com/repository/public' def ALIYUN_JCENTER_URL = 'http://maven.aliyun.com/repository/public' all { ArtifactRepository repo -> if(repo instanceof MavenArtifactRepository){ def url = repo.url.toString() if (url.startsWith('https://repo1.maven.org/maven2')) { project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL." remove repo } if (url.startsWith('https://jcenter.bintray.com/')) { project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_JCENTER_URL." remove repo } } } maven { url ALIYUN_REPOSITORY_URL url ALIYUN_JCENTER_URL } } }
-
正确的 init.gradle 配置:
allprojects{ repositories { def ALIYUN_REPOSITORY_URL = 'https://maven.aliyun.com/repository/public' def ALIYUN_JCENTER_URL = 'https://maven.aliyun.com/repository/public' all { ArtifactRepository repo -> if(repo instanceof MavenArtifactRepository){ def url = repo.url.toString() if (url.startsWith('https://repo1.maven.org/maven2')) { project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL." remove repo } if (url.startsWith('https://jcenter.bintray.com/')) { project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_JCENTER_URL." remove repo } } } maven { url ALIYUN_REPOSITORY_URL url ALIYUN_JCENTER_URL } } }