背景
前兩天接手了其他公司的一個項目黍瞧,項目中大量引用了該公司自己寫的依賴,并且這些依賴項目都放在了公司內(nèi)部的局域網(wǎng)倉庫椎例。如何能將這些依賴成功引入到該項目就成了我馬上要解決的問題挨决。
解決方案
方法一
為我添加局域網(wǎng)的訪問權(quán)限
問題:這個肯定是最簡單的请祖,有了訪問權(quán)限就可以跟使用外網(wǎng)公共倉庫一樣了,但是該公司有規(guī)定脖祈,不能為我開放訪問權(quán)限肆捕。。盖高。
方法二
將依賴包(.aar慎陵、.jar)發(fā)給我,將依賴改成項目內(nèi)的lib依賴
問題:這樣肯定將會改變項目中的依賴代碼或舞,項目當前處于我與該公司交接期間荆姆,這樣的修改無疑會對該公司開發(fā)人員產(chǎn)生影響(除非我不提交代碼),而且像這種引入的依賴包高達70個左右映凳。
方法三
將該公司的開發(fā)人員的gradle下的依賴緩存目錄cache發(fā)給我胆筒,我利用里面緩存的依賴
問題:與我本機的cache合并后,編譯后還是提示找不到依賴包诈豌,可在cache目錄中明明可以找到那個依賴包了仆救。
探索:于是揣測是不是AndroidStudio做緩存時候先把要緩存的依賴包與緩存位置寫入了一個文件,我只是把依賴包copy過來矫渔,那個文件并沒有更改彤蔽。我又開始找那個文件,各種百度也沒有找到庙洼,但卻讓我看到了AndroidStudio存在本地的倉庫顿痪,用了一個依賴庫試了下,可行油够。
使用他人緩存依賴包
1.拷貝他人的緩存依賴包
緩存路徑是.gradle/caches/modules-2/files-2.1
2.找到AndroidStudio的本地倉庫
路徑為:安裝路徑/Contents/gradle/m2repository
3.參考本地倉庫中已有的依賴包copy
在這個本地倉庫中我們能看到很多我們平時項目中常用的依賴庫蚁袭,參考它們的目錄結(jié)構(gòu)把我們從其他電腦上獲取的依賴copy進去。對比下files-2.1和m2repository目錄結(jié)構(gòu):
files-2.1/com.crashlytics.sdk.android/crashlytics/2.6.5/ea45fe12527757f5bbaff83369f27e21879fb30a/crashlytics-2.6.5.aar
m2repository/com/crashlytics/sdk/android/crashlytics/2.6.5/crashlytics-2.6.5.aar
我們可以一個一個copy石咬,但是我上面說過這種依賴包有70個揩悄,一個個copy明顯是不符合我們程序員的作風的,仔細看我們還是能看到規(guī)律的鬼悠,上代碼:
public static void main(String[] args) throws IOException {
String source = "caches中/files-2.1所在目錄";
String destRoot = "m2repository的目錄";
File rootFile = new File(source);
for (File file : rootFile.listFiles()) {
if (file.isDirectory() && file.getName()) {
//將包名轉(zhuǎn)換成文件的層級結(jié)構(gòu)
String destDir = file.getName().replace(".", File.separator);
traversalFile(file, source + File.separator + file.getName(), destRoot + File.separator + destDir);
}
}
}
/**
*遍歷文件
*/
private static void traversalFile(File rootFile, String source, String destRoot) {
for (File subFile : rootFile.listFiles()) {
if (!subFile.getName().equals(".DS_Store")) {
if (subFile.isDirectory()) { //文件夾
traversalFile(subFile, source, destRoot);
} else { //文件
File md5Dir = new File(subFile.getParent());
String copyPath = new File(md5Dir.getParent()).getAbsolutePath().replace(source, destRoot);
File copyDir = new File(copyPath);
if (!copyDir.exists()) {
copyDir.mkdirs();
}
File destFile = new File(copyDir, subFile.getName());
//copy時發(fā)現(xiàn)同一個包同一個版本可能存在多個删性,在這里打印出來那個依賴包存在多個但不進行copy
if (destFile.exists()) {
System.out.println(subFile.getAbsolutePath());
} else {
try {
//引入的common.io的包
FileUtils.copyFile(subFile, destFile);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
至此,大功告成焕窝。