使用sonatype nexus搭建jcenter mirror

之前写过[android]gradle下载加速 - 知乎专栏,用于android gradle指定mirror。后来也写过gradle cache目录(.gradle)剖析 - 知乎专栏,通过.gradle目录创建jcenter。

最近同事觉得此方法太过麻烦,他发现直接使用sonatype nexus的proxy结合Docker来搭建,更简单。正好aliyun的jcenter SonarCube插件版本太低,于是打算自己搭一个。

简单的jcenter mirror

1. 获取docker

2. 获取sonatype nexus的docker image。

我使用的是

docker pull sonatype/nexus3

3. 设置目录共享

在Linux上只要创建/opt/nexus-data即可。在Mac上还要设置该目录为docker共享。

4. 启动

docker run -d -p 8081:8081 --name nexus -v /opt/nexus-data:/nexus-data sonatype/nexus3

5. 使用默认的管理员用户名admin/admin123登录,修改密码。

6. 在Administration/Repository/Repositories中点击Create repository。

然后在Select Recipe选择maven2(proxy)。

Name: jcenter


Maven 2/Layout policy:

Permissive

Proxy/Remote storage: jcenter.bintray.com

其他保持默认。


如果是修改时,还可以调整:

Format: maven2(默认)

Type: proxy

URL: 默认为127.0.0.1:8081/reposito

7. 然后在init.gradle中设置

gradle.projectsLoaded {
    rootProject.allprojects {
        buildscript {
            repositories {
                def REPOSITORY_URL = 'http://127.0.0.1:8081/repository/jcenter'
                all { ArtifactRepository repo ->
                    if (repo instanceof MavenArtifactRepository) {
                        def url = repo.url.toString()
                        if (url.startsWith('https://repo1.maven.org/maven2')
                            || url.startsWith('https://jcenter.bintray.com/')) {
                            project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL."
                            println("buildscript ${repo.url} replaced by $REPOSITORY_URL.")
                            remove repo
                        }
                    }
                }
                jcenter {
                    url REPOSITORY_URL
                }
            }
        }
        repositories {
            def REPOSITORY_URL = 'http://127.0.0.1:8081/repository/jcenter'
            all { ArtifactRepository repo ->
                if (repo instanceof MavenArtifactRepository) {
                    def url = repo.url.toString()
                    if (url.startsWith('https://repo1.maven.org/maven2')
                        || url.startsWith('https://jcenter.bintray.com/')) {
                        project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL."
                        println("allprojects ${repo.url} replaced by $REPOSITORY_URL.")
                        remove repo
                    }
                }
            }
            jcenter {
                url REPOSITORY_URL
            }
        }
    }
}

这样就可以使用mirror功能了。

复杂一些的jcenter mirror

如果希望部署一些自有的库到mirror上,目前我们是创建:

(1)aliyun-central,类型maven(proxy),url为remote storage指定为Index of /repositories/jcenter

(2)jcenter-central,类型maven(proxy),url为remote storage指定为https://jcenter.bintray.com

(3)xxx-releases,类型maven(hosted),Version Policy为Release(默认)。

(4)xxx-snapshots,类型maven(hosted),Version Policy为Snapshot,Deployment Policy为Allow Redeploy。

(5)jcenter,类型maven(group),顺序为:

xxx-snapshots

xxx-releases

aliyun-central

jcenter-central

估计只有两个central有顺序要求,为了使用aliyun来加速下载。

使用方法和上面简单方法一样。上传部分还未研究。