gradle使用maven镜像仓库的方法

gradle使用maven镜像仓库的方法大致上有两种html

修改build.gradle

使用gradle构建的项目,在项目的根目录下都会有一个build.gradle文件,存储着构建的配置,其配置语法使用groovy DSL,因此熟悉groovy的用户能够很轻松上手配置,包括修改依赖的maven仓库。java

gradle的构建依赖一般包含两部分:git

  • 构建前依赖: 指的是若是使用了gradle默认不包含的插件或依赖进行构建,那么gradle自己应该从哪里获取这些依赖工具
  • 构建中依赖: 这里和maven就一致了,说白了就是你的项目都依赖哪些玩意

构建前依赖

buildscript配置

在这个文件首部通常都会看到buildscript {}这个闭包配置,下面有个子闭包repositories {},配置的就是构建前的使用的仓库,一般是gradle插件所在的仓库。 有多个maven {}配置段,分为如下几种可选配置:github

  • mavenLocal(): 直接使用~/.m2/做为maven仓库的路径
  • mavenCentral(): 使用maven中央仓库http://central.maven.org/做为maven仓库的路径
  • jcenter(): 使用jcenter仓库http://jcenter.bintray.com/做为maven仓库路径,在国内一般比mavenCentral()快不少
  • maven { url: '/path/to/custom/url' }: 自定义的maven仓库路径

配置的时候大致须要注意如下两点:mongodb

  • gradle容许存在多个maven仓库,能够从不一样的仓库中拿到依赖
  • 若是存在多个maven仓库,那么将按照书写顺序依次尝试查找依赖

明白以上两点,大致就知道怎么配置了,应该按照速度从快到慢的顺序填写,因此一般mavenLocal()放第一位,mavenCentral()/jcenter()一般放最后做为冗余配置,在本地镜像不可用时做为备用仓库。apache

因而一个依赖于shadow插件的构建前依赖看起来像这样:api

buildscript {
    repositories {
        mavenLocal()
        maven { url "http://maven.aliyun.com/nexus/content/groups/public/" }
        jcenter()
    }
    dependencies {
        classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.3'
    }
}

apply plugin: 'com.github.johnrengelman.shadow'
apply plugin: 'java'

plugin DSL配置

在gradle 2.x的某个版本以后引入了一个新的插件配置DSL plugins {},再也不须要apply from这种形式引入插件,改成plugins { id 'java' }这种形式。不过目前还在孵化中,官方并不建议过早使用,这里也提一下好了。缓存

若是使用了plugins {}这个闭包定义的插件依赖,就再也不使用buildscript {}了,官方默认会从https://plugins.gradle.org/m2/这个仓库去查找插件以及依赖,若是要覆盖这个仓库,不在build.gradle中配置,而是在settings.gradle中,详见官方文档.闭包

settings.gradle的第一个配置块中加入pluginRepositories {}才能够生效,配置语法和repositories {}差很少:app

pluginRepositories {
  maven {
    url 'maven-repo'
  }
}

构建中依赖

定义构建时依赖的仓库就在repositories {}这个闭包中,规则和配置和buildscript.repositories {}彻底一致,这里就再也不赘述了,直接贴样例:

repositories {
    mavenLocal()
    maven { url "https://maven.aliyun.com/repository/public" }
    jcenter()
}

dependencies {
    compile "org.apache.hbase:hbase-client:1.2.2"
    compile "org.mongodb:mongodb-driver:3.3.0"
    compile "org.yaml:snakeyaml:1.17"
    compile 'org.apache.logging.log4j:log4j-core:2.6.2'
    compile 'org.apache.logging.log4j:log4j-api:2.6.2'
}

下面的dependencies {}就是定义的到底依赖哪些jar包,若是本地的gradle缓存中没找到,就会从repositories {}仓库中寻找。

修改init-script方式修改默认仓库

以上的方案适合本身的项目,方便直接修改build.gradle的状况,某些状况下没法直接修改build.gradle,好比参与开源项目,并不方便修改别人写好的配置,再好比在CI流水线中,并不方便对源代码进行任何形式的修改等等场景。

对于这一类的需求,gradle提供了init-script的形式修改仓库。也就是说,这种形式很是相似于Linux的初始化脚本init.d,会加载一遍以后才完成系统启动。每一个gradle命令执行以前会先执行一遍init-script,而后才真正执行构建的task。

所以,咱们只要把仓库的配置写入init-script配置便可,因为build.gradle配置一般都会定义多个maven仓库,所以init-script脚本能够不用考虑仓库冗余的问题。

关于init-script详情能够去看官方文档介绍,我这里简单总结一下。

init脚本的查找路径:

  • 使用-I/--init-script直接在命令行指定初始化脚本
  • ~/.gradle/init.gradle
  • ~/.gradle/init.d/*.gradle
  • ${GRADLE_HOME}/init.d/*.gradle

若是有多个init script能够执行,那么将按照以上的顺序依次执行,对于*.gradle这样的文件将按照文件名排序顺序执行。

撇开别的高级玩法和高级定制不谈,只说说定义镜像仓库怎么搞。个人作法是直接新建~/.gradle/init.d/repo.gradle:

allprojects {
    buildscript {
        repositories {
            maven { url "https://maven.aliyun.com/repository/public" }
        }
    }

    repositories {
        maven { url "https://maven.aliyun.com/repository/public" }
    }
}

这样就等于设置了默认的仓库配置,那么每次执行gradle的时候都会从我但愿的镜像站中去寻找依赖并下载了。

但须要注意的是因为plugins {} DSL目前不使用buildscript {}配置,也没法经过init script定制的方式传入settings.gradle中,因此这种方式是不起做用的。不过好在这个DSL官方还在完善中,也许将来会支持也说不定。

相关文章
相关标签/搜索