Gradle專案依賴管理
作者:黃少存,叩丁狼高階講師。本文為原創文章,轉載請註明出處。
上一篇咱們講解了 Gradle 構建專案的生命週期,這一篇咱們來看下 Gradle 的另一個重要的知識點,就是依賴管理,那為什麼需要依賴管理呢?
依賴管理
幾乎所有基於 JVM 的軟體專案都需要依賴外部的類庫來重用現有的功能程式碼.自動化依賴管理可以明確依賴的版本,能解決傳遞性依賴帶來的版本衝突問題. 而Gradle 就滿足這兩個條件,以下就來看下依賴管理的關鍵點.
依賴管理關鍵點
1.工件座標(jar 包標誌):
- group : 指明 jar 包所在的分組
- name : 指明 jar 包的名稱
- version: 指明 jar 包的版本
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
// 簡寫
// testCompile 'junit:junit:4.12'
}
在 dependencies 中指明依賴的 jar 包
2. 倉庫(jar 包的存放位置)
- 公共倉庫(中央倉庫) Gradle 沒有自己的中央倉庫,可配置使用 Maven 的中央倉庫:mavenCentral/jcenter
- 私有倉庫 配置從本地 maven 倉庫中獲取依賴的 jar 包,不遠端載入 jar 包,使用 mavenLocal
- 自定義 maven 倉庫 自定義倉庫來源,一般指向公司的 Maven 私服.(普片做法)
- 檔案倉庫 本地機器上的檔案路徑,一般不使用,沒有意義,因為構建工具的目的就是去除本機的影響,可以在任何地方公用同一份倉庫資料,跟本機關聯上就沒有太大的意義,當然特殊情況下除外.
repositories {
// 配置本地倉庫
mvaenLocal()
// 配置中央倉庫
// jcenter()
mavenCentral()
// 自定義私服地址
maven {
url ''
}
}
在 repositories 中配置倉庫的指向,在這裡面可配置多個倉庫,會按配置的順序去查詢jar包,找到則獲取,找不到繼續到下一個配置的倉庫去查詢.一般是在最前面配置公司的私服,使用自定義倉庫方式配置.
3. 依賴傳遞性
比如: A 依賴 B,如果 C 依賴 A,那麼 C 依賴 B 就是因為依賴的傳遞性,所以才會出現版本的衝突問題.以下通過一張圖來了解下Gradle 的自動化依賴管理流程.
由圖可得知,Gradle 工具從遠端倉庫下載 jar 包到本地倉庫,Gradle 工具需要依賴配置檔案,如果同一個 jar 經常使用會被存入到依賴快取中.
4.依賴階段配置
在 build.gradle 中的 dependencies 中配置依賴,依賴分以下四種依賴. 原始碼依賴: compile , runtime 測試依賴: testCompile, runtime
關係圖如下:
- compile 配置依賴的 jar ,測試程式碼編譯和執行以及原始碼執行一定存在.
- runtime 配置依賴的 jar,只有原始碼執行和測試執行存在.
- testCompile 配置依賴的 jar,測試程式碼的編譯和執行存在.
- testRuntime 配置依賴的 jar,只有測試程式碼的執行存在.
以上的四種配置選用的主要判斷依據是是否僅是執行階段需要依賴或是否僅是測試階段需要依賴
.
僅執行階段需要依賴使用 runtime ,如果僅是測試階段需要依賴加 test 字首 testCompile 或 testRuntime.
以上是依賴管理的配置和概念點的講解,接下來咱們來實際配置一個依賴,來為專案加入一個logbok依賴.
5. 加入 logbok 依賴
dependencies {
testCompile 'junit:junit:4.12'
testCompile 'ch.qos.logback:logback-classic:1.2.3'
}
5.3 重新整理匯入
在 test 包下書寫 MyTest.java 檔案
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyTest {
private static final Logger LOGGER = LoggerFactory.getLogger(MyTest.class);
public static void main(String[] args) {
LOGGER.info("logback 測試");
}
}
以上咱們就把日誌依賴的 jar 匯入到了專案,現在專案就可以使用日誌了. logback 下的兩個包為 logback 依賴的 jar 包,由於依賴的傳遞性,所以目前專案的測試程式碼也依賴了這兩個包,比如slf4j. 如果此專案引入了其他的 jar 包,而這些 jar 也依賴了slf4j,但是版本不一樣的情況下就存在了版本衝突問題,像版本衝突在開發中是經常遇到的,那麼在 Gradle 中如何解決版本衝突呢? 請期待下一篇 <<Gradle版本衝突問題>>