文档章节

gradle使用maven镜像仓库的方法

Feng_Yu
 Feng_Yu
发布于 2016/11/08 13:55
字数 1322
阅读 2298
收藏 5
点赞 0
评论 0

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 "http://maven.aliyun.com/nexus/content/groups/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 "http://maven.aliyun.com/nexus/content/groups/public/" }
        }
    }

    repositories {
        maven { url "http://maven.aliyun.com/nexus/content/groups/public/" }
    }
}

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

但需要注意的是由于plugins {} DSL目前不使用buildscript {}配置,也无法通过init script定制的方式传入settings.gradle中,所以这种方式是不起作用的。不过好在这个DSL官方还在完善中,也许未来会支持也说不定。

© 著作权归作者所有

共有 人打赏支持
Feng_Yu
粉丝 154
博文 38
码字总数 45477
作品 0
西安
运维
Android开发中遇到的的Gradle相关问题总结

Android开发中遇到的的Gradle相关问题总结 snowdream - Impossible is nothing!2017-06-0629 阅读 androidgradle 作者:snowdream Email:yanghui1986527#gmail.com Github: https://github......

snowdream - Impossible is nothing!
2017/06/06
0
0
jcenter,maven和grandle

1.jcenter用来作什么? JCenter is the place to find and share popular Apache Maven packages for use by Maven, Gradle, Ivy, SBT, etc. jcenter仓库网页地址:https://bintray.com/bintra......

a_liujin
2016/06/30
0
0
快速构建docker镜像:maven插件

越来越多的项目开始了docker容器化部署的进化,在容器化之前我们部署一个项目,可能由源代码产出一个jar或者war即可直接发布了,启动之后是一个java进程;容器化之后,由源代码产出的是一个d...

rabbitGYK
04/15
0
0
环境部署

首先是打开官方的LibGDX部署工具(jar包),工具中有可选参数,首先是游戏名,包名,游戏类,部署工具导出项目的具体位置,Android SDK的路径,然后是项目类型,桌面游戏?安卓?iOS?还是网...

别怕_有我在
2017/11/13
0
0
Gradle入门系列(3):依赖管理

转载: 本文由 伯乐在线 - JustinWu 翻译。未经许可,禁止转载! 英文出处:Petri Kainulainen。欢迎加入翻译组。 在现实生活中,要创造一个没有任何外部依赖的应用程序并非不可能,但也是极...

低至一折起
2017/12/05
0
0
maven用户试用gradle

老话,适合的才是最好的。 此处不做gradle和maven的比较。只说下我,一个偏执的maven用户如何尝试使用gradle的经验。 我用maven好些年了,自己机器上还搭了个nexus。 最近看到有个demo需要g...

大漠小北
2015/01/20
0
21
Gradle构建入门

Gradle构建入门 会飞的污熊2017-12-102 阅读 springgradle 在开发Spring Boot应用的时候,除了Maven以外,Gradle也是一个不错的构建选择。IDEA 默认使用Gradle工具做Android的构建程序,在开...

会飞的污熊
2017/12/10
0
0
Maven/JCenter,Ant/Gradle

> jcenter仓库 Android 快速发布开源项目到jcenter- http://blog.csdn.net/lmj623565791/article/details/51148825 使用Gradle发布Android开源项目到JCenter- http://blog.csdn.net/maosidi......

shareus
2017/11/24
0
0
Gradle打jar包如何上传到maven本地库

前言 本篇教程偏向实战,程序猿直接copy代码加入到自己的项目中做简单的修修改改便可使用,而对于Gradle以及Maven不在此进行展开介绍,如有读者希望了解可以给我留言,并持续关注,我后续会慢...

互扯程序
2017/12/19
0
0
jenkins + docker实现java服务的cd

jenkins + docker实现java服务的cd 四号程序员2017-11-283 阅读 Linux cd(持续部署)是非常好的软件研发实践。 本文介绍如果通过jenkins(和一些插件) + docker实现java项目的持续部署(cd)。 ...

四号程序员
2017/11/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

电脑炸了,浪费我好几天时间,还是简要记下来吧

我的小本本一直在兢兢业业的干活,然而前几天说炸就炸了...... 爆炸现场: 软件: windows10 pro + EIS11+ 360卫士 BIOS:N1DET98W 2.24 硬件: Xeon E3 1505-V5 nv-M3000M thinkpadP70:20E...

Oh_really
7分钟前
0
0
Git之branch和checkout

1.branch是查看、创建、删除分支 #>git branch --helpNAME git-branch - List, create, or delete branchesSYNOPSIS git branch [--color[=<when>] | --no-color] [......

汉斯-冯-拉特
8分钟前
0
0
Mybatis拦截器之数据权限过滤与分页集成

需求场景 最近项目有个数据权限的业务需求,要求大致为每个单位只能查看本级单位及下属单位的数据,例如:一个集团军下属十二个旅,那么军级用户可以看到所有数据,而每个旅则只能看到本旅部...

佛系程序猿灬
18分钟前
4
0
Vue作为MVVM框架,M、V、VM分别代表什么?

<script src="vue.js"></script><div id="demo"> {{message}} <input v-model="message"></div><script> var vm = new Vue({ el: '#demo', data: { mes......

JamesView
21分钟前
0
0
SpringCloud 微服务 (十六) 服务追踪 Zipkin

问题 在服务中,有一个接口,该A接口中又调用了其他服务的B、C、D接口,出现一个请求耗时大的问题,这时候并不知道该B、C、D接口中哪个接口造成的耗时量,然后比如确定C服务接口出现的耗时量大,但...

___大侠
今天
0
0
Java面试基础篇——第八篇:抽象类与接口的区别

1.抽象类 抽象类:如果一个类中包含有抽象方法,或这个类使用abstract关键字修饰,则称这个类是抽象类。 抽象方法是什么呢?抽象方法就是指用abstract关键字修饰的方法。 需要注意的是:抽象...

developlee的潇洒人生
今天
2
0
jsoup 相关资料

1.jsoup 2.Jsoup概述 3.jsoup入门 4.jsoup Java HTML Parser 1.11.3 API

IT追寻者
今天
0
0
JPA @MappedSuperclass 注解说明

基于代码复用和模型分离的思想,在项目开发中使用JPA的@MappedSuperclass注解将实体类的多个属性分别封装到不同的非实体类中。 1.@MappedSuperclass注解只能标准在类上:@Target({java.lang....

海博1600
今天
0
0
【一】Scala Configuration 相关API

Play使用了 Typesafe config library,但是也提供了一个有着更多Scala高级特性的的 Configuration 封装。不熟悉Typesafe配置的开发者可以移步 configuration文件的语法和特性文档。 读取配置...

Landas
今天
3
0
使用cookie技术 记住账号

1. 效果 2. 实现过程 2.1 前端 将用户的选中传递给后台 这个参数的获取是 参考:https://my.oschina.net/springMVCAndspring/blog/1860498 // var rememberLogin = $("#rememberLoginId").i...

Lucky_Me
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部