Gradle 設置全局鏡像源

来源:https://www.cnblogs.com/mkckr0/archive/2023/09/19/17714374.html
-Advertisement-
Play Games

複製 init.gradle.kts 文件到 Windows 的 %USERPROFILE%/.gradle 或者 Linux 的 ~/.gradle 目錄下。也可以直接複製文末的代碼為 init.gradle.kts。 Gradle 不支持鏡像源的直接設置,只能通過 maven() 方法設置一個新 ...


複製 init.gradle.kts 文件到 Windows 的 %USERPROFILE%/.gradle 或者 Linux 的 ~/.gradle 目錄下。也可以直接複製文末的代碼為 init.gradle.kts


Gradle 不支持鏡像源的直接設置,只能通過 maven() 方法設置一個新的 Maven 倉庫地址。

在 init.gradle 中調用 maven() 會導致鏡像倉庫排在上游倉庫之後,會導致Gradle 優先使用上游倉庫。如果直接刪除上游倉庫又會出現新的問題。Maven 鏡像源和上游倉庫並不是完全實時同步的,可能會缺失某些文件,特別是一些剛發佈的包。所以上游倉庫必須保留並且需要排在鏡像倉庫之後。

在使用過程中發現阿裡雲的 Maven 鏡像源仍然會出現找不到文件的錯誤。排查之後發現阿裡雲鏡像源的某個包竟然只有 POM 文件而沒有 JAR 文件。在這種情況下 Gradle 找到了 POM 文件就會僅使用阿裡雲鏡像源,然後找不到 JAR 文件報錯,而不會繼續使用上游倉庫。查閱 Gradle 文檔之後,發現有個 artifactUrls() 方法可以設置 Maven 倉庫的除 POM 文件之外的其他文件下載地址。這樣就可以通過在鏡像倉庫中將上游倉庫地址設置為Artifact URL解決這個問題。

普通的 Java 或 Kotlin 項目預設是在 build.gradle 里設置 Maven 倉庫地址,所以在 init.gradle 里需要在 allprojects 代碼塊中設置鏡像源。而 Android 項目預設都是在 settings.gradle 的 pluginManagementdependencyResolutionManagement 代碼塊中設置 Maven 倉庫地址。僅在 allprojects 中設置鏡像源沒有用。所以還需要在 settingsEvaluated 代碼塊中進行設置。

一些舊的項目在添加 Google Maven 倉庫時,直接使用 maven("https://maven.google.com") 而不使用 google() 方法。構建項目時會一直卡在 Building 的狀態,並且沒有任何提示。maven.google.com 這個功能變數名稱在國內是 ping 不通的。而如果使用 google() 方法,Gradle 會使用 "https://dl.google.com/dl/android/maven2",這個鏈接在國內可以直連。所以需要將上游 Google 倉庫的 "https://maven.google.com" 替換為 "https://dl.google.com/dl/android/maven2"。

解決一系列問題之後,最終的 init.gradle 完成了。Gradle 同時支持 Groovy DSL(.gradle) 和 Kotlin DSL(.gradle.kts)。我選擇後者編寫 init.gradle.kts。由於 Gradle 直接兩種 DSL 語言的混用,所以如果之後構建 Groovy DSL 形式的 Gradle 項目,也不需要額外再編寫 init.gradle。


// https://gist.github.com/mkckr0/97ec5b0d99feede4c19ee6f905d5e722

val repoMirrorMap = mapOf(
    "https://repo.maven.apache.org/maven2" to "https://maven.aliyun.com/repository/central",
    "https://dl.google.com/dl/android/maven2" to "https://maven.aliyun.com/repository/google",
    "https://plugins.gradle.org/m2" to "https://maven.aliyun.com/repository/gradle-plugin",
    "https://jcenter.bintray.com" to "https://maven.aliyun.com/repository/jcenter",
)
val repoReplaceMap = mapOf(
    "https://maven.google.com" to "https://dl.google.com/dl/android/maven2"
)

fun RepositoryHandler.setMirrors() {
    all {
        if (this is MavenArtifactRepository && !name.endsWith("Origin")) {
            val originName = name
            var originUrl = url.toString().trimEnd('/')

            // do replace
            repoReplaceMap[originUrl]?.let { newUrl ->
                originUrl = newUrl
                setUrl(originUrl)
            }

            // do mirror
            repoMirrorMap[originUrl]?.let { newUrl ->
                // replace into mirror repo
                setUrl(newUrl)
                // add origin repo to find missing jars
                artifactUrls(originUrl)
                // keep origin repo to find missing POM
                maven(originUrl) { name = "$originName Origin" }
            }
        }
    }
    printRepos()
}

fun RepositoryHandler.printRepos() {
    all {
        if (this is MavenArtifactRepository) {
            println("Maven Repo: name=\"$name\", url=$url, artifacts=${artifactUrls}")
        }
    }
}

settingsEvaluated {
    pluginManagement {
        repositories {
            setMirrors()
        }
    }
    dependencyResolutionManagement {
        @Suppress("UnstableApiUsage")
        repositories {
            setMirrors()
        }
    }
}

allprojects {
    buildscript {
        repositories {
            setMirrors()
        }
    }
    repositories {
        setMirrors()
    }
}

本文來自博客園,作者:mkckr0,轉載請註明原文鏈接:https://www.cnblogs.com/mkckr0/p/17714374.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 因為我本身沒有參與過項目架構,所以為了避免後續的開發過程中項目無序,繁雜。所以在這裡我要給我自己設定一個規範。 後端 目前採用的就是:Net6(長期支持)+倉儲模式(類似三層架構) 雖然現在流行微服務,但我目前還沒法自己完全去做,還得學啊! 目前8的預覽版已經出現,但是得申請,7的話是標準期限支持, ...
  • 可擴展性對於物聯網管理系統的設計和開發非常重要,它直接影響著系統的性能、可靠性和能耗等方面,是評估一個系統優劣的重要因素之一。可擴展性對物聯網管理系統的影響主要體現在以下幾個方面: ...
  • 引言 作為一名後端工程師,使用終端是一種常見的做法,也是你應該學習的技能。許多命令和實用程式可以幫助你在使用 Linux 時更有效地完成任務。 基本 Linux 命令 如果你想使用 Linux 操作系統,學習常用的命令將會大有幫助。本篇將為後端工程師回顧一些基本到高級的 Linux 操作命令。 基礎 ...
  • 1. MySQL的客戶端/伺服器通信協議 1.1. MySQL的客戶端和伺服器之間的通信協議是“半雙工”的 1.2. 在任何時刻,要麼是由伺服器向客戶端發送數據,要麼是由客戶端向伺服器發送數據,這兩個動作不能同時發生 1.3. 當查詢的語句很長的時候,參數max_allowed_packet就特別重 ...
  • 引入 本文在兩台2核2g的雲伺服器上搭建了Hadoop集群,兩台雲伺服器分別是阿裡雲(hjm)和騰訊雲(gyt),集群部署規劃如下: hjm gyt HDFS NameNode\SecondaryNameNode\DataNode DataNode YARN ResourceManager\Node ...
  • 一、邏輯存儲結構 表空間(Tablespace):一個mysql實例,及一個資料庫實例,可以對應多個表空間(ibd文件),用於存儲記錄,索引等數據。 段(Segment):分為數據段(Leaf node segment)、索引段(Non-leaf node segment)、回滾段(Rollback ...
  • 之前寫的一個 Flutter 收音機,支持桌面端和手機端,在https://www.cnblogs.com/imlgc/p/17536481.html ,寫完之後就不怎麼管了。後面陸陸續續有人郵件索要驗證碼,不是經常使用的郵箱,所有也不經常打開,也導致很多人沒有收到回覆。 所以,乾脆將這個東西開源了 ...
  • 在DAYU200開發板上燒寫OpenHarmony系統,利用huaweicloud-iot-device-sdk完成華為雲IoT平臺對接,完成物聯網數據通信。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...