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官方還在完善中,也許將來會支持也說不定。

相關文章
相關標籤/搜索