gradle緩存位置及拷貝jar到maven資源庫

gradle構建工具是當下最流行的java項目構建工具,不僅僅是在android開發中用得很普遍,而且在javaee開發中也越來越普及。甚至其熱度超過了maven構建工具。

gradle可以通過指定倉庫地址爲本地maven倉庫地址和遠程倉庫地址相結合的方式,避免每次都會去遠程倉庫下載依賴庫。這種方式也有一定的問題,如果本地maven倉庫有這個依賴,就會從直接加載本地依賴,如果本地倉庫沒有該依賴,那麼還是會從遠程下載。但是下載的jar不是存儲在本地maven倉庫中,而是放在自己的緩存目錄中。一般默認爲~/.gradle/caches/modules-2/files-2.1,如下所示:

這個問題就很讓人糾結了,如果使用gradle構建項目,那麼依賴庫會來源於兩個地方,一個是maven repository,另一個就是caches。這個問題在國外有人討論過:

sirinath :How to download and cache artifacts into local Maven Repository from Gradle
sirinath:I want the dependencies to be stored in the local Mavan Repo than the Gradle local repo
Peter_Niederwieser:Gradle will always store downloaded artifacts in its own cache. You can additionally use artifacts stored in the local Maven repository by declaring a ‘mavenLocal()’ repository. You can install into the local Maven repository by applying the ‘maven’ plugin and running the ‘install’ task.
carlo_lf:indeed, this is something I am missing. Are there any plans to support the download to the local maven repository?
luke_daley:It’s very necessary to have our own repository for a few reasons. Moreover, to say that Gradle uses Maven’s dependency management functionality is incorrect.
大致意思是:sirinath提出一個問題說,gradle能不能將下載的jar包放入maven repository目錄中,而不是存儲在caches下。

carlo_If表示,是否有開發計劃將gradle下載的地址指向maven倉庫。

而Peter_Niederwieser和luke_daley均一致表示gradle有必要有自己的倉庫地址,而且下載的文件會放在caches下面。

有可能你會說,既然gradle caches有一個地址,maven倉庫有一個地址,那麼可不可以將gradle caches指向maven repository。我們說這是不行的,caches下載文件不是按照maven倉庫中存放的方式,這裏以com.google.guava:guava:23.0爲例:

1、group不是以com/gooble/guava文件夾的形式存在,而是以com.google.guava文件夾的形式存在。

2、jar父級目錄是一個隨機的字符串,不是guava/23.0目錄。

這樣問題就不是簡簡單單的改變caches目錄的問題了。

強迫症患者有的提出了一個想法就是將caches中的依賴庫,拷貝到maven repository中,這樣就涉及到需要改變目錄結構。這裏給出一個gradle的task。具體內容如下:

task cacheToLocalMavenRepository(type: Copy) {
  from new File(gradle.gradleUserHomeDir, 'caches/modules-2/files-2.1')
  into repositories.mavenLocal().url
  eachFile {
    List<String> parts = it.path.split('/')
    it.path = (parts[0]+ '/' + parts[1]).replace('.','/') + '/' + parts[2] + '/' + parts[4]
  }
  includeEmptyDirs false
}


執行之後的結果:

執行完成之後,在項目中右鍵build.gradle->Gradle->Refresh Gradle Project,再次查看jar來源,全部變爲了maven repository。

這種辦法不是徹底的解決了caches與maven repository兩者合爲一個目錄的問題。只是解決了項目中依賴庫來源於同一個地方。如果在build.gradle中添加一個新的dependency,而這個dependency的版本或者name在maven repository中沒有的話,使用gradle構建,他仍然會下載遠程倉庫中的jar包到自己的caches中。

Gradle already checks the local Maven repository for artifacts. If it finds an artifact with matching coordinates and checksum, it will not download it again. (For best results, make sure to use a recent Gradle version.)

這句話是從gradle論壇上找到的,gradle會先檢查本地maven倉庫,如果發現了對應的依賴庫,不會再次下載。從語境中可以分析,如果不存在,那麼gradle還是會去下載,並且存放到自己的caches目錄中。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章