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目录中。
 

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