Gradle 下面不下來建椰,這個應(yīng)該大家都遇到過的事情。有解決方案就是使用離線方式。但是又會增長別的一些問題笛洛,例如:
- 版本不對乃坤,離線版本過高或過低
但是使用在線的又會出現(xiàn)下載半天沒有反應(yīng)蝌诡,不知道到底下載多少了或速度怎么樣浦旱。優(yōu)點:
只要下載一次宣蠕,使用起來不會有別的問題。
總是所述镰禾,感覺還是使用在線的方式是比較好的吴侦。只需要解決下載的問題即可劫樟。首先我發(fā)現(xiàn)gradle的下載配置是在 gradle/wrapper/gradle-wrapper.properties,里面包括下載地址叠艳、緩存地址等等附较。
所以這時候我首先想到的就是修改下載地址拒课,把他放到一個下載速度比較快的地方黑竞,例如:國內(nèi)的七牛云、公司內(nèi)部地址等扎酷。
雖然這樣會快一點法挨,但是產(chǎn)生了新的問題:
- 每次新的項目里面下載地址要修改凡纳,雖然可以修改模板文件來解決這個問題,但是分享給別人的時候會造成別人的不便
- 查看別人項目的時候巷怜,又要修改它
總之感覺就是麻煩延塑。
這時候我發(fā)現(xiàn) gradle 的緩存在 .gradle/wrapper/dists下面关带,如圖:
這時候我發(fā)現(xiàn)沼撕,只要我自己通過別的方式下載下來务豺,放在各個目錄下面即可冲呢。但是這時候又有了新的問題招狸。目錄里面的這一層文件名是如何生成的?
大家都知道其實每次執(zhí)行 gradlew 的時候,實際上就是調(diào)用了 gradle/wrapper/gradle-wrapper.jar 這個文件营勤,這里面肯定會有文件名的生成方式葛作。 gradle 是開源的,大家可以直接查看源碼或 反編譯這個jar 文件猖凛。
我是使用反編譯的赂蠢,但是也沒有想那么多,后面發(fā)現(xiàn)查看源碼會更容易些辨泳。
從 gradlew 腳本中虱岂,我們知道程序的入口類是 GradleWrapperMain,這時候我們發(fā)現(xiàn)真正的執(zhí)行情況如下:
所以我把目標(biāo)定在 Install ,Download, PathAssembler, BootstrapMainStarter,這幾個類里面玖院。
首先查看了Download,沒什么發(fā)現(xiàn)第岖,就是一個簡單的下載难菌,文件文件路徑是已知的了,因為Download是 Install的入?yún)⒚镒遥晕液竺娌榭戳诉@個類郊酒,結(jié)果有點發(fā)現(xiàn):
后面就直接查看了PathAssembler的 getDistribution方法,結(jié)果很明顯:
其實就是下載地址得 MD5,然后經(jīng)過 BigInteger 轉(zhuǎn)一下。然后驗證一下荠耽,結(jié)果是對的。
以后我就可以直接愉快的通過別的方式下載好,解壓到指定目錄就可以了拍谐。
java 生成方式
private static String getMd5Hash(String string) {
try {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
byte[] bytes = string.getBytes();
messageDigest.update(bytes);
return new BigInteger(1, messageDigest.digest()).toString(32);
} catch (Exception e) {
throw new RuntimeException("Could not hash input string.", e);
}
}
gradle 方式
import java.security.MessageDigest
def distribution = 'https://services.gradle.org/distributions/gradle-2.8-all.zip'
task getWrapperDiskCacheName << {
MessageDigest messageDigest = MessageDigest.getInstance('MD5')
messageDigest.update(distribution.bytes)
name = new BigInteger(1, messageDigest.digest()).toString(32)
println("source: $distribution")
println("wrapper disk cache name : $name")
}
看到這里亡蓉,點個贊吧