JavaRush /Java Blog /Random-TW /Gradle 快速簡介
Viacheslav
等級 3

Gradle 快速簡介

在 Random-TW 群組發布

介紹

本評測的主題是 Gradle 自動建置系統。在英語中,建置系統稱為Build ToolsКраткое знакомство с Gradle - 1為什麼這是必要的?在 Java 中手動建立專案是一個相當耗費人力的過程。需要正確指出專案需要的以及專案所依賴的程式庫和框架。在這裡您可以閱讀一篇關於 Habré 的優秀文章:「在命令列上使用 Java」。遲早您將開始創建一些腳本來自動化此流程。現在想像一下,世界各地的所有開發人員都這樣做,每個人都重新編寫某人已經為他們的專案編寫的內容。然後出現了項目組裝系統,使這個過程自動化。此外,一方面,它們允許您按照自己想要的方式組裝項目,另一方面,它們為您提供或多或少標準化的工具。Gradle 的替代方案是 Maven 自動建置系統。一方面,這兩種組裝系統不同,但另一方面,它們也有許多相似之處。Gradle 網站上有關於此主題的資料:「從 Maven 遷移到 Gradle」。如本教學所述,Gradle 和 Maven 對於如何建置專案有不同的看法。Gradle 是基於任務圖,任務可以相互依賴。任務執行某種工作。Maven 使用某些階段的模型,並附加某些「目標」。這些目標是完成一些工作的地方。然而,透過這些不同的方法,兩個建構系統都遵循相同的約定,並且依賴關係管理也相似。要開始使用 Gradle,您需要下載它。在 Google 或 Yandex 中,我們輸入“Gradle Build Tool”,在第一個結果中我們看到官方網站: https: //gradle.org。在 Gradle 主頁面上有一個帶有文字「Docs」的鏈接,可指向Gradle 文件。首先,我們需要安裝(Install)Gradle,因此我們對文件的「安裝 Gradle 」部分感興趣。安裝方法有很多種,包括“老式”方法,即 手動(“手動安裝”)。根據說明,下載「僅二進位」類型的文件,該文件的名稱類似於 gradle-5.1.1-bin.zip。接下來,解壓縮存檔並根據說明配置 PATH 環境變數。最主要的是,執行指令後,指令gradle -v會顯示已安裝的Gradle的版本。可能存在一個問題,在確定位置時,系統會發現Gradle不是你想要的位置。因此,在 Windows 上您可以執行以下操作(在 *nix 上有類似的操作): for %i in (gradle.bat) do @echo. %~$PATH:i 現在,也許我們可以開始熟悉了。
Краткое знакомство с Gradle - 2

初始化 Gradle 項目

我想立即指出,Gradle 是關於執行稱為任務的任務我將稱其為任務)。任務由各種插件提供。我建議您閱讀官方文件中有關插件的更多資訊:「Using Gradle Plugins」。安裝 Gradle 後,有一組始終可用的「核心插件」。這些插件有不同的類別,但我們對「實用程式」類別感興趣。該套件包括「Build Init Plugin」插件,它提供初始化 Gradle 專案的任務。我們有興趣創建一個專案類型:「java-application」。讓我們執行 Gradle 任務: gradle init --type java-application 讓我們回答一些問題,例如,我們想要使用 Groovy DSL(Gradle 的標準任務描述語言)和 JUnit 測試框架(我們將在另一篇評論中討論這個問題)。創建後我們將收到以下一組文件:
Краткое знакомство с Gradle - 3
首先,初始化後,我們收到一個為我們的 Gradle 版本預先配置的特殊包裝器 - 這是一個特殊的腳本。我建議您閱讀官方文件 - “ The Gradle Wrapper ”,以了解更多相關資訊。其次,我們看到 Gradle 建置腳本 - build.gradle 檔案。這是主文件,它描述了我們的專案使用了哪些程式庫和框架,需要將哪些插件連接到專案並描述了各種任務。我建議您在官方文件中閱讀有關此文件的更多資訊:「Build Script Basics」。
Краткое знакомство с Gradle - 4

插件和任務

如果我們現在查看建置腳本的內容,我們將看到插件部分:
plugins {
    id 'java'
    id 'application'
}
這些插件與我們之前討論過的插件相同。如果有插件,那麼我們現在就可以完成一些任務。我們可以執行 gradletasks 命令並查看現在可以對專案執行哪些操作:
Краткое знакомство с Gradle - 5
例如,透過執行gradle run我們將啟動 java 應用程式的主類別:
Краткое знакомство с Gradle - 6
我們可以看到,下面也是這樣寫的,2 actionable tasks: 1 executed, 1 up-to-date 這是什麼意思呢?這意味著總共完成了2個任務:而且,實際上完成了1個,還有一個沒有執行,因為… 它是最新的,即狀態是當前的並且尚未執行任何操作。我們可以執行所謂的「Dry Run」:gradle run -m 讓我們執行這個指令,我們會看看執行run任務會執行哪些任務:
Краткое знакомство с Gradle - 7
我們可以看到,總共完成了4個任務:在執行run之前,它執行了依賴任務類別。這些類別本身有2個依賴項,因此它也執行compileJava和processResources。當我們執行一項任務時,我們可以在執行該任務的同時查看一定程度的日誌(日誌記錄等級決定了我們希望看到的訊息的重要程度)。例如,我們可以這樣做gradle run -i。這也將向我們顯示訊息訊息,例如:
Task :classes UP-TO-DATE
Skipping task ':classes' as it has no actions.
有關Gradle登入的更多信息,我建議您參考官方文檔:“ Gradle Logging ”。正如我們所看到的,類別任務被跳過,因為它是UP-TO-DATE,也就是說,狀態是當前的,不需要執行任何操作,因此沒有任何操作。這是因為預設情況下 Gradle 具有「最新檢查」或所謂的增量建置。您可以在 Gradle 文件中閱讀有關此機制的更多資訊:「最新檢查(又稱增量建置)」。但可以透過執行指定 --rerun-tasks 標誌的任務來停用此機制。例如,gradle run --rerun-tasks。然後我們會看到:2 個可操作任務: 2 個已執行 如您所見,已執行任務的數量只考慮了圖的第一層,即運行任務本身以及它直接依賴的那些任務,即、 類。類別所依賴的任務這裡不計算在內(儘管它們是在執行類別任務時執行的)。您還應該閱讀有關任務的資訊:
Краткое знакомство с Gradle - 8

依賴關係

任何建置系統的主要任務之一是管理依賴關係,即我們的專案需要哪些庫/框架。建置系統必須確保它們在正確的時間可用,並以正確的方式組裝應用程式的最終工件。預設情況下,在 java-application 的 gradle init 之後,我們將在建置腳本中看到以下內容:
dependencies {
    implementation 'com.google.guava:guava:26.0-jre'
    testImplementation 'junit:junit:4.12'
}
在這裡,我們所連結的內容一目了然。但沒有一些了解,就不清楚implementation和testImplementation是什麼?這裡我們需要再次轉向Gradle文檔,因為Gradle的文檔寫得很好。它稱為“管理依賴項配置”。如文件中所述,每個依賴項都是在特定範圍內聲明的 - 該依賴項在該範圍內可用。此範圍由某些配置指定,每個配置都有唯一的名稱。同樣有趣的是,許多 Gradle 插件都添加了預先定義的配置。要了解我們可以運行哪些配置: gradle --console plain dependencies 這樣我們將看到所有可用配置及其依賴項的清單。我們可以過濾此列表,以便只看到可用的配置本身: gradle --console plain dependencies | find " - " 我們如何知道要使用什麼?你必須在這裡做一點閱讀。因為 我們使用“Java”插件,所以讓我們從它的文件和“依賴管理”部分開始。在這裡我們看到曾經有一個配置(又稱作用域)稱為“compile”,它的意思是“編譯期間需要的依賴項”。但後來它被實作所取代(英語為Superseded)。您可以在「 API 和實作分離」部分中閱讀有關替換的更多資訊。事實證明,這種依賴關係將位於「編譯類別路徑」上。但有時我們希望我們的依賴項包含在最終的工件中。為了什麼?例如,我們將有一個可執行的 jar,它本身應該包含所有必需的內容。那我們該怎麼辦呢?首先,不存在「開箱即用」的支援(即預設情況下,無需任何其他操作)。這是因為每個人都想以自己的方式收集檔案,而 Gradle 試圖做到極簡。我們也不能在類別路徑上使用 jar 檔案(無需在程式碼中進行額外的操作),因為 它不會那樣工作(有關更多詳細信息,請參閱“ Oracle:將類別新增至 JAR 檔案的類別路徑」)。因此,最漂亮的方式是建置腳本中的以下程式碼:
jar {
    manifest {
        attributes 'Main-Class': 'jrgradle.App'
    }
    from configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}
在 jar 任務設定中,我們指定將新增至 jar 檔案清單中的內容(請參閱「Oracle:設定應用程式的入口點」)。然後我們說編譯所需的所有依賴項都將包含在 jar 中。另一種方法是使用「Gradle Shadow Plugin」。它可能看起來很複雜,但其他插件可以讓生活變得更輕鬆。例如,當創建一個 Web 應用程式(而不是常規運行的 java 應用程式)時,我們將使用一個特殊的插件 - “ Gradle War Plugin ”,它具有不同的行為,我們的生活會更輕鬆(所有必要的依賴項都會由插件本身放在單獨的特殊目錄中。此類工作由 Web 應用程式的設計方式來規範。但這是一個完全不同的故事)。
Краткое знакомство с Gradle - 9

結果

Gradle是專案建置系統的絕佳選擇。Spring 和 Hibernate 等知名專案的開發人員都在使用它,這一事實證實了這一點。上面只討論了最基本的事情。它們的背後隱藏著開發人員擁有的數百萬個功能和機會。Gradle 也支援建立多模組項目,這不在本次評論中,但 Gradle 本身有一個很棒的教學:「建立多項目建置」。我希望這篇評論也表明 Gradle 的文檔是在 5+ 級別編寫的,如果您了解在哪裡查找,您可以輕鬆找到您需要的內容。當你了解基礎知識時,這就會發生。此外,Gradle 有很棒的教學。最後我想列出一個小清單,列出您可以使用 Gradle 看到的其他內容:
Краткое знакомство с Gradle - 10
#維亞切斯拉夫
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION