Gradle wrapper 使用国内镜像的那点事

文章目录

Gradle wrapper 这东西不知道什么时候,下载被迁移到了 Github 的 release 里,下载速度骤降,曾几何时 Gradle 团队还高调宣布国内 CDN,现在看来 Gradle 团队也降本增效了。

解决方案有如下几种,具体使用什么方式,要看你自己的情况。

直接替换 url

这种情况适用于项目是内部项目或者都是国内人员参与的项目。

替换方式为直接替换 gradle/wrapper/gradle-wrapper.properties 下的 url 到国内镜像即可, 比如 https://mirrors.cloud.tencent.com/gradle/gradle-8.5-all.zip

使用代理

自备

不能替换的情况

比如某个项目是开源项目,你需要上传到 github,那你就不应该这么做了,你不能假定使用者都是国内的人。 这种情况下可能就需要研究下正常情况下是放在哪里的了。

主要方式就是自行下载并复制到对应文件夹下。

默认情况下,每个版本的 Gradle wrapper 会在 $GRADLE_HOME/wrapper/dists/{version}/{hash} 下 这个 version 是包含类型的,例如 gradle-7.4-all ,是包含 -all 后缀的。 然后 hash 则是 md5 后的 base36,生成方法在

 1
 2    /**
 3     * This method computes a hash of the provided {@code string}.
 4     * <p>
 5     * The algorithm in use by this method is as follows:
 6     * <ol>
 7     *    <li>Compute the MD5 value of {@code string}.</li>
 8     *    <li>Truncate leading zeros (i.e., treat the MD5 value as a number).</li>
 9     *    <li>Convert to base 36 (the characters {@code 0-9a-z}).</li>
10     * </ol>
11     */
12    private String getHash(String string) {
13        try {
14            MessageDigest messageDigest = MessageDigest.getInstance("MD5");
15            byte[] bytes = string.getBytes();
16            messageDigest.update(bytes);
17            return new BigInteger(1, messageDigest.digest()).toString(36);
18        } catch (Exception e) {
19            throw new RuntimeException("Could not hash input string.", e);
20        }
21    }

其实这样,我们只需要根据 url 替换,并帮它完成下载步骤即可,写个工具即可。

工具在下面自取。