gradle 设置网络代理, 全局 maven 仓库代理

[TOC]

修改项目中的 gradle.properties 文件,增加配置项:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# org.gradle.jvmargs=-DsocksProxyHost=127.0.0.1 -DsocksProxyPort=51087
# socks proxy
systemProp.socks.proxyHost=127.0.0.1
systemProp.socks.proxyPort=51087
# http proxy
systemProp.http.proxyHost=127.0.0.1
systemProp.http.proxyPort=51087
# https proxy
systemProp.https.proxyHost=127.0.0.1
systemProp.https.proxyPort=51087
# no proxy
systemProp.https.nonProxyHosts=192.168.*|localhost
systemProp.http.nonProxyHosts=192.168.*|localhost

可以在 GRADLE_USER_HOME 下, 新建文件 gradle.properties,然后设置代理

GRADLE_USER_HOME 的路径一般如下:

系统路径
Linux/home/<username>/.gradle/
OS X/Users/<username>/.gradle/
WindowsC:\Users\<username>\.gradle\

在每个 gradle 工程中,包含很多固定叫 gradle.properties 的文件

properties 文件本质为 key=value 键值对,也支持配置域 [域名称]

并且 gradle 支持 module 模式,那么每次编译时,就会按照 默认 -> 全局 -> 工程 -> 模组 的顺序加载 gradle.properties 那么同一个 key 的值,按照 默认 -> 全局 -> 工程 -> 模组 的顺序依次覆盖

gradle 4.0 以后支持 kts 插件,官方迁移文档 https://docs.gradle.org/current/userguide/migrating_from_groovy_to_kotlin_dsl.html

$USER_HOME/.gradle 目录下,创建目录 init.d,在目录中创建文件 .init.gradle.kts 内容为

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
apply<AliyunMavenRepositoryPlugin>() // cancel global maven proxy annotation this line

class AliyunMavenRepositoryPlugin: Plugin<Gradle> {

    override fun apply(gradle: Gradle) {
        gradle.allprojects {
            // https://maven.aliyun.com/mvn/guide
            repositories {
                jcenter { // http://jcenter.bintray.com/
                    name = "aliyunJcenter"
                    url = uri("https://maven.aliyun.com/repository/public")
                }
                google { // https://maven.google.com/
                    name = "aliyunGoogle"
                    url = uri("https://maven.aliyun.com/repository/google")
                }
                mavenCentral { // https://repo1.maven.org/maven2/
                    name = "aliyunMavenCentral"
                    url = uri("https://maven.aliyun.com/repository/central")
                }
            }
        }
    }

}
  • 不管是安卓还是其他项目,只要是用到 gradle 的项目,在启动时都会自动加载这个插件,将对应的 maven 仓库地址转换到阿里云
  • 取消使用这个插件,只需要注释 apply<AliyunMavenRepositoryPlugin>() 这句即可
  • 其他仓库的代理,设置方法类似

因为 gradle 4.0 以下不支持 kts 故使用下面的方式来配置代理仓库

$USER_HOME/.gradle 目录下,创建目录 init.d,在目录中创建文件 init.gradle 内容为

1
2
3
4
5
6
7
8
allprojects {
    repositories {
        maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
        maven { url 'https://maven.aliyun.com/repository/public/' }
        maven { url 'https://maven.aliyun.com/repository/central' }
        maven { url 'https://maven.aliyun.com/repository/google' }
    }
}
  • 更优的做法是同时移除被代理的仓库,当然前提是代理仓库可用
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
allprojects {
    repositories {
        // proxy repository start doc see: https://maven.aliyun.com/mvn/guide
        // def PROXY_URL_REPO_GRADLE_PLUGIN = "https://maven.aliyun.com/repository/gradle-plugin"
        def PROXY_URL_REPO_CENTRAL= "https://maven.aliyun.com/repository/central"
        def PROXY_URL_REPO_GOOGLE = "https://maven.aliyun.com/repository/google"
        def PROXY_URL_REPO_PUBLIC = "https://maven.aliyun.com/repository/public"
        def PROXY_URL_REPO_JCENTER = "https://maven.aliyun.com/repository/public"
        def PROXY_URL_REPO_SPRING = "https://maven.aliyun.com/repository/spring"
        def PROXY_URL_REPO_SPRING_PLUGIN = "https://maven.aliyun.com/repository/spring-plugin"
        def PROXY_URL_REPO_GRAILS_CORE = "https://maven.aliyun.com/repository/grails-core"
        all { ArtifactRepository repo ->
            if(repo instanceof MavenArtifactRepository){
                def url = repo.url.toString()
                // if (url.startsWith("https://plugins.gradle.org/m2/")) {
                //     project.logger.lifecycle "Repository ${repo.url} replaced by $PROXY_URL_REPO_GRADLE_PLUGIN."
                //     remove repo
                // }
                if (url.startsWith("https://repo1.maven.org/maven2/")) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $PROXY_URL_REPO_CENTRAL."
                    remove repo
                }
                if (url.startsWith("https://maven.google.com/")) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $PROXY_URL_REPO_GOOGLE."
                    remove repo
                }
                if (url.startsWith("http://jcenter.bintray.com/")) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $PROXY_URL_REPO_PUBLIC."
                    remove repo
                }
                if (url.startsWith("http://repo.spring.io/libs-milestone/")) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $PROXY_URL_REPO_SPRING."
                    remove repo
                }
                if (url.startsWith("http://repo.spring.io/plugins-release/")) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $PROXY_URL_REPO_SPRING_PLUGIN."
                    remove repo
                }
                if (url.startsWith("https://repo.grails.org/grails/core")) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $PROXY_URL_REPO_GRAILS_CORE."
                    remove repo
                }
            }
        }
        // maven {
        //     url PROXY_URL_REPO_GRADLE_PLUGIN
        // }
        maven {
            url PROXY_URL_REPO_CENTRAL
        }
        maven {
            url PROXY_URL_REPO_GOOGLE
        }
        maven {
            url PROXY_URL_REPO_PUBLIC
        }
        maven {
            url PROXY_URL_REPO_SPRING
        }
        maven {
            url PROXY_URL_REPO_SPRING_PLUGIN
        }
        maven {
            url PROXY_URL_REPO_GRAILS_CORE
        }
        // proxy repository end
    }
}

这个方法同 kts 插件 会相互干扰,优先加载 init.gradle,然后再生效 kts 插件,建议直接使用 kts 插件,更加直观容易配置

增加 $USER_HOME/.gradle 目录下,目录 init.d 中,文件 init.gradle 内容

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
allprojects {
    repositories {
        maven { //custom maven repository host like nexus.custom.com
            credentials {
                username 'username' // username as base-auth
                password 'password' // password as base-auth
            }
            url "https://nexus.custom.com/repository/android-maven-group/"
        }
        ...
        // proxy repository start ...
        // proxy repository end
    }
}

建议,把私有 maven 地址放到代理仓库前,这样寻找依赖更迅速

修改 gradle-wrapper.properties 文件中的 distributionUrl 属性

不推荐使用,如果使用请使用模板

1
2
#distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip
distributionUrl=file\:/User/home/....
1
2
3
4
5
6
7
allprojects {
    repositories {
        maven {
          url 'file:///Users/sinlov/Downloads/mvn-repo/SNAPSHOT/'
        }
    }
}

注意格式 file:// 协议