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' }
配置的時候大體需要注意以下兩點:
- 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官方還在完善中,也許未來會支援也說不定。