1. 程式人生 > >Maven倉庫映象

Maven倉庫映象

好用的maven映象:

 <mirror>
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorOf>central</mirrorOf>
  </mirror>
  <mirror> 
    <id>uk</id>  
    <mirrorOf>central</mirrorOf>  
    <name>Human Readable Name for this Mirror.</name>  
    <url>http://uk.maven.org/maven2/</url> 
  </mirror>
   <mirror>
    <id>CN</id>
    <name>OSChina Central</name>
    <url>http://maven.oschina.net/content/groups/public/</url>
    <mirrorOf>central</mirrorOf>
  </mirror>


在gradle中使用maven映象:

引入以下文章內容:

https://my.oschina.net/abcfy2/blog/783743

構建前依賴

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