maven-metadata.xml 在构建时不断收到请求
maven-metadata.xml keeps getting requested when building
AGP 4.2.2
gradle-6.7.1
arcticfox 2020.3.1
每次我构建我的 android 项目时,我都会看到这个 maven-metadata.xml 并且它似乎会减慢构建速度并且它似乎只是挂在那里。每次构建可能需要 10 分钟。
有没有办法避免这种情况?
Gradle: Download maven-metadata.xml...
当我 运行 一个命令行时,我看到了这个:
这是我的gradle.properties
org.gradle.jvmargs=-Xmx8g -XX:MaxPermSize=512m -XX:ReservedCodeCacheSize=256m -XX:+UseCompressedOops -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.caching=true
org.gradle.configureondemand=true
kotlin.coroutines=enable
kotlin.code.style=official
kapt.use.worker.api=true
kapt.incremental.apt=true
android.enableD8.desugaring=true
android.useAndroidX=true
android.enableJetifier=true
我正在使用 build.gradle(app) 中指定的一些 Maven 存储库:
maven { url "https://www.jitpack.io" }
maven { url 'http://......./repo/maven2' }
maven { url "https://....../repositories/snapshots" }
maven { url 'https://....../maven/release' }
maven { url "http://......./bintray.com/maven" }
maven { url "https://....../objectbox/objectbox" }
maven-metadata.xml
文件下载缓慢的原因是您的代理存储库之一的远程速度非常慢。
如果 "metadata max age"
和 "not found cache ttl"
设置太低,这个问题会更加复杂。因此它会检查圆圈太快并且每次都从头开始下载。将其调至 12 小时。默认值应该是 30 分钟(1800 秒),这太短了。
要设置 max age
,您可以简单地遵循此 site。
另一个好article管理Http Cache Headers
。
这个问题有点不好说,因为没有提供build.gradle
。但我假设,原因是任何 -SNAPSHOT
依赖项没有被缓存。针对该依赖项的本地副本构建应该不会一遍又一遍地下载 maven-metadata.xml
;或使用 mavenLocal()
。针对稳定版本构建也应该会导致缓存。
Gradle通常需要下载一个maven-metadata.xml
文件,如果
- 您使用 dynamic/changing version 作为您的依赖之一,并且
- 依赖缓存中的time to live (TTL)已经结束
对于 (1),您应该在声明的依赖项中查找 1.2.3-SNAPSHOT
或 1.2.+
之类的版本(或为简单起见,在 ./gradlew dependencies
中查找)。如果你有任何这样的版本,你真的需要它们吗?使用像 1.2.3
这样的固定版本应该会更快。
对于 (2),您是否更改了默认的 TTL 阈值,或者您是否始终使用 --refresh-dependencies
进行构建?如果不是,那么缓慢的发生频率至少不应超过一天一次。
如果以上方法没有帮助,那么可以尝试 运行 使用 --info
或 --info --refresh-dependencies
构建并仔细观察日志输出。这应该显示哪个依赖项 and/or 哪个存储库是罪魁祸首(即,日志记录停留时间最长的那个)。如果你找到这样的罪魁祸首,那么你可以调查
- 替换依赖项(或存储库),
- 提高存储库服务器或网络的速度,或者
- 从有问题的
maven-metadata.xml
文件中删除旧快照版本(如果您控制存储库)。
如果所有这些仍然没有出现可操作的项目,那么也许值得在 Gradle 依赖项缓存中寻找更大的 maven-metadata.xml
文件。也许重复下载如此大的文件是问题所在,之前列表中的方法之一可能会有所帮助。下面是如何找到十大 maven-metadata.xml
文件的方法(使用 Unix shell 命令):
find ~/.gradle/caches/modules-2/resources-* \
-name maven-metadata.xml \
-printf '%s\t%p\n' \
| sort -k1 \
| tail
Chriki 的回答为我指明了正确的方向,找到了一个简单的解决方案。下载所有依赖项后(在我的例子中,我使用的是 -SNAPSHOT 库,它希望在每个 运行 上更新),你可以在离线模式下设置 Gradle。这将阻止Gradle 下载新的元数据等
在 Android Studio 中,您有一个专用按钮来切换在线模式(见图
Android studio settings).
其他答案很好地说明了为什么会发生这种情况。尤其是在使用 -SNAPSHOT
依赖的时候,如果实在没办法,我给你一个小窍门,希望对你有很大帮助。
是使用离线模式
当通过 CLI 运行 时,执行
./gradlew someTask --ofline
当 运行 通过 IDE 时,启用离线模式。
AGP 4.2.2
gradle-6.7.1
arcticfox 2020.3.1
每次我构建我的 android 项目时,我都会看到这个 maven-metadata.xml 并且它似乎会减慢构建速度并且它似乎只是挂在那里。每次构建可能需要 10 分钟。
有没有办法避免这种情况?
Gradle: Download maven-metadata.xml...
当我 运行 一个命令行时,我看到了这个:
这是我的gradle.properties
org.gradle.jvmargs=-Xmx8g -XX:MaxPermSize=512m -XX:ReservedCodeCacheSize=256m -XX:+UseCompressedOops -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.caching=true
org.gradle.configureondemand=true
kotlin.coroutines=enable
kotlin.code.style=official
kapt.use.worker.api=true
kapt.incremental.apt=true
android.enableD8.desugaring=true
android.useAndroidX=true
android.enableJetifier=true
我正在使用 build.gradle(app) 中指定的一些 Maven 存储库:
maven { url "https://www.jitpack.io" }
maven { url 'http://......./repo/maven2' }
maven { url "https://....../repositories/snapshots" }
maven { url 'https://....../maven/release' }
maven { url "http://......./bintray.com/maven" }
maven { url "https://....../objectbox/objectbox" }
maven-metadata.xml
文件下载缓慢的原因是您的代理存储库之一的远程速度非常慢。
如果 "metadata max age"
和 "not found cache ttl"
设置太低,这个问题会更加复杂。因此它会检查圆圈太快并且每次都从头开始下载。将其调至 12 小时。默认值应该是 30 分钟(1800 秒),这太短了。
要设置 max age
,您可以简单地遵循此 site。
另一个好article管理Http Cache Headers
。
这个问题有点不好说,因为没有提供build.gradle
。但我假设,原因是任何 -SNAPSHOT
依赖项没有被缓存。针对该依赖项的本地副本构建应该不会一遍又一遍地下载 maven-metadata.xml
;或使用 mavenLocal()
。针对稳定版本构建也应该会导致缓存。
Gradle通常需要下载一个maven-metadata.xml
文件,如果
- 您使用 dynamic/changing version 作为您的依赖之一,并且
- 依赖缓存中的time to live (TTL)已经结束
对于 (1),您应该在声明的依赖项中查找 1.2.3-SNAPSHOT
或 1.2.+
之类的版本(或为简单起见,在 ./gradlew dependencies
中查找)。如果你有任何这样的版本,你真的需要它们吗?使用像 1.2.3
这样的固定版本应该会更快。
对于 (2),您是否更改了默认的 TTL 阈值,或者您是否始终使用 --refresh-dependencies
进行构建?如果不是,那么缓慢的发生频率至少不应超过一天一次。
如果以上方法没有帮助,那么可以尝试 运行 使用 --info
或 --info --refresh-dependencies
构建并仔细观察日志输出。这应该显示哪个依赖项 and/or 哪个存储库是罪魁祸首(即,日志记录停留时间最长的那个)。如果你找到这样的罪魁祸首,那么你可以调查
- 替换依赖项(或存储库),
- 提高存储库服务器或网络的速度,或者
- 从有问题的
maven-metadata.xml
文件中删除旧快照版本(如果您控制存储库)。
如果所有这些仍然没有出现可操作的项目,那么也许值得在 Gradle 依赖项缓存中寻找更大的 maven-metadata.xml
文件。也许重复下载如此大的文件是问题所在,之前列表中的方法之一可能会有所帮助。下面是如何找到十大 maven-metadata.xml
文件的方法(使用 Unix shell 命令):
find ~/.gradle/caches/modules-2/resources-* \
-name maven-metadata.xml \
-printf '%s\t%p\n' \
| sort -k1 \
| tail
Chriki 的回答为我指明了正确的方向,找到了一个简单的解决方案。下载所有依赖项后(在我的例子中,我使用的是 -SNAPSHOT 库,它希望在每个 运行 上更新),你可以在离线模式下设置 Gradle。这将阻止Gradle 下载新的元数据等
在 Android Studio 中,您有一个专用按钮来切换在线模式(见图 Android studio settings).
其他答案很好地说明了为什么会发生这种情况。尤其是在使用 -SNAPSHOT
依赖的时候,如果实在没办法,我给你一个小窍门,希望对你有很大帮助。
是使用离线模式
当通过 CLI 运行 时,执行
./gradlew someTask --ofline
当 运行 通过 IDE 时,启用离线模式。