## 19.1\. Enter the daemon 走進守護進程
Gradle 守護進程(有時也稱為構建守護進程) 的目的是改善 Gradle 的啟動和執行時間。
我們準備了幾個守護進程非常有用的用例。對于一些工作流,用戶會多次調用 Gradle,以執行少量的相對快速的任務。舉個例子:
* 當使用測試驅動開發時,單元測試會被執行多次。
* 當開發一個 web 應用程序中,應用程序會被組裝多次。
* 當發現構建能做什么,在 gradle tasks 在哪里會執行多次。
對以上各種工作流來說,讓調用 Gradle 的啟動成本盡可能小會很重要。
此外,如果可以相對較快地建立 Gradle 模型,用戶界面可以提供一些有趣的功能。例如,該守護進程可能用于以下情形:
* 在 IDE 中的內容幫助
* 在 GUI 中的實時可視化構建
* 在 CLI 中的 tab 鍵完成
一般情況下,構建工具的敏捷行為總是可以派上用場。如果你嘗試在你的本地構建中使用守護進程的話,它會變得讓你很難回到正常的 Gradle 使用。
Tooling API (參見?[Chapter 63\. Embedding Gradle 嵌入 Gradle](https://github.com/waylau/Gradle-2-User-Guide/blob/master/Chapter%2063.%20Embedding%20Gradle%20%E5%B5%8C%E5%85%A5%20Gradle.md)) 在整個過程當中都使用守護進程。如,你無法在沒有守護進程時正式地使用 Tooling API。這意味著當您在 Eclipse中使用 STS Gradle 或在 Intellij IDEA 中使用 Gradle 支持時,您已經在使用 Gradle 守護進程。
未來,該守護進程還會提供更多的功能:
* 敏捷的 up-to-date 檢查:使用本地文件系統修改通知(例如,通過 jdk7 nio.2)預先執行 up-to-date 分析。
* 更快的構建: 預評估項目,這樣當用戶接下來調用 Gradle 時,模型就準備好了。
* 我們提到了更快的構建嗎?守護進程可以預先下載依賴項或進行快照依賴的新版本檢查。
* 使用可用于編譯和測試的一個可復用線程池。例如,Groovy 和 Scala 的編譯器啟動開銷都很大。構建守護進程可以維持一個已下載的 Groovy 和 (或) Scala 進程。
* 預先執行某些任務,比如編譯。更快的反饋。
* 快速、 準確的 bash 的 tab 鍵完成。
* Gradle 緩存的定期垃圾收集。
## [](https://github.com/waylau/Gradle-2-User-Guide/blob/master/Chapter%2019.%20The%20Gradle%20Daemon%20%E5%AE%88%E6%8A%A4%E8%BF%9B%E7%A8%8B.md#192-reusing-and-expiration-of-daemons-重用和失效的守護程序)19.2\. Reusing and expiration of daemons 重用和失效的守護程序
基本的思想是, gradle 命令會 fork 一個守護進程,用于執行實際的構建。Gradle 命令的后續調用將重用該守護進程,以避免啟動開銷。有時我們不能使用現有的守護進程,是因為它正忙或其 java 版本或 jvm 參數不同。關于fork一個完全新的守護進程的具體細節,請閱讀下面的專題。守護進程將在空閑3小時后自動失效。
以下是我們 fork 一個新的守護進程的所有情況:
* 如果該守護進程當前正忙于運行一些作業,將啟動一個全新的守護進程。 對每個java home,我們會fork一個單獨的守護進程。所以即使有一些閑置的守護進程等待構建請求,但你碰巧通過不同的 java HOME 運行構建,那么一個全新的守護進程將會被 fork。
* 如果用于構建的 jvm 的參數足夠不同,我們會 fork 一個單獨的守護進程。例如,如果某些系統屬性已經更改,我們不會 fork 一個新的守護進程。然而,如果 -Xmx 內存設置更改了,或一些基本的不變的系統屬性更改了 (例如 file.encoding),那么將 fork 新的守護進程。
* 在這一刻,守護進程會被加上 Gradle 的特定版本號。這意味著即使一些守護進程處于空閑狀態,但您正在運行的構建與 Gradle 不同版本,也將啟動一個新的守護進程。這也有一種 --stop 命令行指令的結果: 當運行 --stop 時,您僅可以停止以你的 Gradle 版本啟動的守護進程。
我們計劃在將來改進守護進程的managing / pooling的方法。
## [](https://github.com/waylau/Gradle-2-User-Guide/blob/master/Chapter%2019.%20The%20Gradle%20Daemon%20%E5%AE%88%E6%8A%A4%E8%BF%9B%E7%A8%8B.md#193-usage-and-troubleshooting-用法和故障排除)19.3\. Usage and troubleshooting 用法和故障排除
關于命令行的用法,可以看一下專題[Appendix D. Gradle Command Line 命令行](https://github.com/waylau/Gradle-2-User-Guide/blob/master/Appendix%20D.%20Gradle%20Command%20Line%20%E5%91%BD%E4%BB%A4%E8%A1%8C.md)。如果你已經厭倦反復使用相同的命令行選項,可以看看第 20.1 章節,“通過 gradle.properties 配置構建環境”。這一章節包含了有關如何以一種“持久化”的方式配置某些行為(包括在默認情況下打開守護進程)的信息。
以下是有關 Gradle 守護進程的故障排除的一些方面:
* 如果你的構建有問題,請嘗試暫時禁用守護進程 (您可以通過使用命令行開關--no-daemon)。
* 有時候,您可能想要通過--stop命令行選項或更有力的方式停止守護程序。
* 默認情況下位于 Gradle 用戶主目錄有一個守護進程的日志文件。
* 你可能想要以--foreground模式啟動守護程序,以觀察構建是怎么執行的。
## [](https://github.com/waylau/Gradle-2-User-Guide/blob/master/Chapter%2019.%20The%20Gradle%20Daemon%20%E5%AE%88%E6%8A%A4%E8%BF%9B%E7%A8%8B.md#194-configuring-the-daemon-配置守護進程)19.4\. Configuring the daemon 配置守護進程
可以配置一些守護進程的設置,例如 JVM 參數、 內存設置或Java home目錄。有關更多信息請參閱20.1章節, “通過 gradle.properties 配置構建環境”
- 關于
- 第1章 Introduction 介紹
- 第2章 Overview 總覽
- 第3章 Tutorials 教程
- 第4章 Installing Gradle 安裝
- 第5章 Troubleshooting 問題解決
- 第6章 Build Script Basics 構建腳本的基礎識
- 第7章 Java Quickstart 快速開始 Java
- 第8章 Dependency Management Basics 依賴管理的基礎知識
- 第9章 Groovy Quickstart 快速開始 Groovy
- 第10章 Web Application Quickstart 快速開始 Web 應用
- 第11章 Using the Gradle Command-Line 使用 Gradle 命令行
- 第12章 Using the Gradle Graphical User Interface 使用 Gradle 圖形化用戶界面
- 第13章 Writing Build Scripts 編寫構建腳本
- 第14章 Tutorial - 'This and That' 教程-這個那個
- 第15章 More about Tasks 更多關于任務
- 第16章 Working With Files 跟文件工作
- 第17章 Using Ant from Gradle 從 Gradle 使用 Ant
- 第18章 Logging 日志.md
- 第19章 The Gradle Daemon 守護進程
- 第20章 The Build Environment 構建環境
- 第21章 Gradle Plugins 插件
- 第22章 Standard Gradle plugins 標準 Gradle 插件
- 附錄E Existing IDE Support and how to cope without it 支持的 IDE 以及如何應對沒有它