gradle编译,因仓库地址被墙或不存在,导致编译慢或无法编译问题

2021-12-27
2分钟阅读时长

在编译java应用,比如android应用,有些组件仓库,使用的是国外仓库,甚至仓库中心本身已经关闭或者迁移,所以需要使用国内镜像,加快下载速度。

解决方法两种:

  1. 配置代理

  2. 翻墙下载组件,放到仓库下,地址 用户目录/.gradle/caches/modules-2/files-2.1

  3. 配置仓库镜像,一些特殊的组件没有在镜像中,只能使用后面方法

    配置镜像,配置的地方可以两处:可以直接在工程中配置,也可以全局配置 (对电脑上所有的工程起作用),以上配置一个即可。

详细配置方法:

一. 在代码工程中配置

  1. gradle.properties中有proxy的配置,这个只能在公司中使用 (也许有效,我暂时注释了),现在启用了阿里云镜像,在BIM的rn项目的develop分支已经做了调整
##下面是公司的代理服务器地址,如果还有问题,必须翻墙,且在公司里编译,gradle.properties中去掉下面的注释
#systemProp.https.proxyHost=192.168.0.119
#systemProp.https.proxyPort=3128

2. 出现java.lang.NoClassDefFoundError android.support.v4.content.ContextCompat 报错

在react-native-*的一些包中,导入了android.support.v4.content.ContextCompat

  1. 找到报错的文件,将文件中

import android.support.v4.content.ContextCompat;

改成

import androidx.core.content.ContextCompat;

  1. 注意修改gradle.properties文件,在BIM的rn项目的develop分支已经做了调整
android.useAndroidX=true
android.enableJetifier=true
  1. 修改build.gradle,在上面增加。在BIM的rn项目的develop分支已经做了调整
allprojects {
    repositories {

        def ALIYUN_REPO_URL = 'https://maven.aliyun.com/repository/public/'
        def ALIYUN_JCENTER_URL = 'https://maven.aliyun.com/repository/jcenter/'
        def ALIYUN_GOOGLE_URL = 'https://maven.aliyun.com/repository/google/'
        def ALIYUN_GRADLE_PLUGIN_URL = 'https://maven.aliyun.com/repository/gradle-plugin/'
        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_REPO_URL."
                    remove repo
                }
                if (url.startsWith('https://jcenter.bintray.com/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_JCENTER_URL."
                    remove repo
                }
                if (url.startsWith('https://dl.google.com/dl/android/maven2/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GOOGLE_URL."
                    remove repo
                }
                if (url.startsWith('https://plugins.gradle.org/m2/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GRADLE_PLUGIN_URL."
                    remove repo
                }
            }
        }
        mavenLocal()
        maven { url ALIYUN_REPO_URL }
        maven { url ALIYUN_JCENTER_URL }
        maven { url ALIYUN_GOOGLE_URL }
        maven { url ALIYUN_GRADLE_PLUGIN_URL }

  }
 }

二. 全局配置init.gradle

  1. [可选] 所在操作系统中,创建系统或者用户的全局变量

创建以下环境变量,例如在MAC/linux下 /etc/profile,

##根据不同的操作系统,安装的实际路径做修改
GRADLE_HOME=/usr/loca/gradle
GRADLE_USER_HOME =/Users/i/.m2/repository
##添加PATH
PATH=$PATH:$GRADLE_HOME/bin

windows下参考

WIN+R → 输入sysdm.cpl → 选择系统属性→高级→点击环境变量(面板右下角)→添加用户和系统级别的环境变量

  1. 创建init.gradle,

创建init.gradle,可以放在以下目录之一,HOME是用户目录,GRADLE_HOME是gradle的安装目录

$HOME/.gradle/

$HOME/.gradle/init.d/

$GRADLE_HOME/init.d/

allprojects{
    repositories {
        def ALIYUN_REPOSITORY_URL = 'https://maven.aliyun.com/repository/public/'
        def ALIYUN_JCENTER_URL = 'https://maven.aliyun.com/repository/jcenter/'
        def ALIYUN_GOOGLE_URL = 'https://maven.aliyun.com/repository/google/'
        def ALIYUN_GRADLE_PLUGIN_URL = 'https://maven.aliyun.com/repository/gradle-plugin/'
        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
                }
                if (url.startsWith('https://dl.google.com/dl/android/maven2/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GOOGLE_URL."
                    remove repo
                }
                if (url.startsWith('https://plugins.gradle.org/m2/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GRADLE_PLUGIN_URL."
                    remove repo
                }
            }
        }
        jcenter() { url 'https://maven.aliyun.com/repository/public' }
        //maven { url 'https://maven.aliyun.com/repository/gradle-plugin'}
        maven { url ALIYUN_REPOSITORY_URL }
        maven { url ALIYUN_JCENTER_URL }
        maven { url ALIYUN_GOOGLE_URL }
        maven { url ALIYUN_GRADLE_PLUGIN_URL }
    }
}