gradle
使用maven镜像仓库的方法大体上有两种
修改build.gradle
使用gradle
构建的项目,在项目的根目录下都会有一个build.gradle
文件,存储着构建的配置,其配置语法使用groovy DSL
,所以熟悉groovy
的用户可以很轻松上手配置,包括修改依赖的maven仓库。
gradle的构建依赖通常包含两部分:
- 构建前依赖: 指的是如果使用了gradle默认不包含的插件或依赖进行构建,那么gradle本身应该从哪里获取这些依赖工具
- 构建中依赖: 这里和maven就一致了,说白了就是你的项目都依赖哪些玩意
构建前依赖
buildscript配置
在这个文件首部一般都会看到buildscript {}
这个闭包配置,下面有个子闭包repositories {}
,配置的就是构建前的使用的仓库,通常是gradle插件所在的仓库。 有多个maven {}
配置段,分为以下几种可选配置:
-
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仓库路径
配置的时候大体需要注意以下两点:
- gradle允许存在多个maven仓库,可以从不同的仓库中拿到依赖
- 如果存在多个maven仓库,那么将按照书写顺序依次尝试查找依赖
明白以上两点,大体就知道怎么配置了,应该按照速度从快到慢的顺序填写,所以通常mavenLocal()
放第一位,mavenCentral()
/jcenter()
通常放最后作为冗余配置,在本地镜像不可用时作为备用仓库。
于是一个依赖于shadow插件的构建前依赖看起来像这样:
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 {}
差不多:
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官方还在完善中,也许未来会支持也说不定。