Gradle 依賴管理基礎

2022-08-03 10:46 更新

本章節(jié)介紹如何使用 Gradle 進行基本的依賴管理.

什么是依賴管理?

通俗來講,依賴管理由如下兩部分組成。首先,Gradle 需要知道項目構建或運行所需要的一些文件,以便于找到這些需要的文件。我們稱這些輸入的文件為項目的依賴。其次,你可能需要構建完成后自動上傳到某個地方。我們稱這些輸出為發(fā)布。下面來仔細介紹一下這兩部分:

大部分工程都不太可能完全自給自足,一般你都會用到其他工程的文件。比如我工程需要 Hibernate 就得把它的類庫加進來,比如測試的時候可能需要某些額外 jar 包,例如 JDBC 驅動或 Ehcache 之類的 Jar 包。

這些文件就是工程的依賴。Gradle 需要你告訴它工程的依賴是什么,它們在哪,然后幫你加入構建中。依賴可能需要去遠程庫下載,比如 Maven 或者 Ivy 庫。也可以是本地庫,甚至可能是另一個工程。我們稱這個過程叫依賴解決。

通常,依賴的自身也有依賴。例如,Hibernate 核心類庫就依賴于一些其他的類庫。所以,當 Gradle 構建你的工程時,會去找到這些依賴。我們稱之為依賴傳遞。

大部分工程構建的主要目的是脫離工程使用。例如,生成 jar 包,包括源代碼、文檔等,然后發(fā)布出去。

這些輸出的文件構成了項目的發(fā)布內容。Gralde 也會為你分擔這些工作。你聲明了發(fā)布到到哪,Gradle 就會發(fā)布到哪。“發(fā)布”的意思就是你想做什么。比如,復制到某個目錄,上傳到 Maven 或 Ivy 倉庫?;蛘咴谄渌椖坷锸褂?,這些都可以稱之為發(fā)行。

依賴聲明

來看一下這個腳本里聲明依賴的部分:

聲明依賴

build.gradle

apply plugin: 'java'
repositories {
    mavenCentral()
}
dependencies {
    compile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.7.Final'
    testCompile group: 'junit', name: 'junit', version: '4.+'
}

這是什么意思呢?這段腳本是這么個意思。首先,Hibernate-core.3.6.7.final.jar 這貨是編譯期必需的依賴。并且這貨相關的依賴也會一并被加載進來,該段腳本同時還聲明項目測試階段需要 4.0 版本以上的 Junit。同時告訴 Gradle 可以去 Maven 中央倉庫去找這些依賴。下面的章節(jié)會進行更詳細的描述。

依賴配置

Gradle 中依賴以組的形式來劃分不同的配置。每個配置都只是一組指定的依賴。我們稱之為依賴配置 。你也可以借由此聲明外部依賴。后面我們會了解到,這也可用用來聲明項目的發(fā)布。

Java 插件定義了許多標準配置項。這些配置項形成了插件本身的 classpath。比如下面羅列的這一些,并且你可以從 “Java 插件 - 依賴配置”了解到更多詳細內容.。

compile

編譯范圍依賴在所有的 classpath 中可用,同時它們也會被打包

runtime

runtime 依賴在運行和測試系統(tǒng)的時候需要,但在編譯的時候不需要。比如,你可能在編譯的時候只需要 JDBC API JAR,而只有在運行的時候才需要 JDBC 驅動實現(xiàn)

testCompile

測試期編譯需要的附加依賴

testRuntime

測試運行期需要

不同的插件提供了不同的標準配置,你甚至也可以定義屬于自己的配置項。

外部依賴

依賴的類型有很多種,其中有一種類型稱之為外部依賴。這種依賴由外部構建或者在不同的倉庫中,例如 Maven 中央倉庫或 Ivy 倉庫中抑或是本地文件系統(tǒng)的某個目錄中。

定義外部依賴需要像下面這樣進行依賴配置

定義外部依賴

build.gradle

dependencies {
    compile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.7.Final'
}

外部依賴包含 group,name 和 version 幾個屬性。根據(jù)選取倉庫的不同,group 和 version 也可能是可選的。

當然,也有一種更加簡潔的方式來聲明外部依賴。采用:將三個屬性拼接在一起即可。"group:name:version"

快速定義外部依賴

build.gradle

dependencies {
    compile 'org.hibernate:hibernate-core:3.6.7.Final'
}

倉庫

Gradle 是在一個被稱之為倉庫的地方找尋所需的外部依賴。倉庫即是一個按 group,name 和 version 規(guī)則進行存儲的一些文件。Gradle 可以支持不同的倉庫存儲格式,如 Maven 和 Ivy,并且還提供多種與倉庫進行通信的方式,如通過本地文件系統(tǒng)或 HTTP。

默認情況下,Gradle 沒有定義任何倉庫,你需要在使用外部依賴之前至少定義一個倉庫,例如 Maven 中央倉庫。

使用 Maven 中央倉庫

build.gradle

repositories {
    mavenCentral()
}

或者其它遠程 Maven 倉庫:

使用 Maven 遠程倉庫

build.gradle

repositories {
    maven {
        url "http://repo.mycompany.com/maven2"
    }
}

或者采用 Ivy 遠程倉庫

采用 Ivy 遠程倉庫

build.gradle

repositories {
    ivy {
        url "http://repo.mycompany.com/repo"
    }
}

或者在指定本地文件系統(tǒng)構建的庫。

采用本地 Ivy 目錄

build.gradle

repositories {
    ivy {
        // URL can refer to a local directory
        url "../local-repo"
    }
}

一個項目可以采用多個庫。Gradle 會按照順序從各個庫里尋找所需的依賴文件,并且一旦找到第一個便停止搜索。

了解更多庫相關的信息請參閱章節(jié) 50.6,“倉庫”。

打包發(fā)布

依賴配置也被用于發(fā)布文件[3]我們稱之為打包發(fā)布發(fā)布。

插件對于打包提供了完美的支持,所以通常而言無需特別告訴 Gradle 需要做什么。但是你需要告訴 Gradle 發(fā)布到哪里。這就需要在 uploadArchives 任務中添加一個倉庫。下面的例子是如何發(fā)布到遠程 Ivy 倉庫的:

發(fā)布到 Ivy 倉庫

build.gradle

uploadArchives {
    repositories {
        ivy {
            credentials {
                username "username"
                password "pw"
            }
            url "http://repo.mycompany.com"
        }
    }
}

執(zhí)行 gradle uploadArchives,Gradle 便會構建并上傳你的 jar 包,同時會生成一個 ivy.xml 一起上傳到目標倉庫。

當然你也可以發(fā)布到 Maven 倉庫中。語法只需稍微一換就可以了。[4]

p.s:發(fā)布到 Maven 倉庫你需要 Maven 插件的支持,當然,Gradle 也會同時產生 pom.xml 一起上傳到目標倉庫。

發(fā)布到 Maven 倉庫

build.gradle

apply plugin: 'maven'
uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: "file://localhost/tmp/myRepo/")
        }
    }
}

下一步目標

若對 DSL 感興趣,請看 Project.configurations{},Project.repositories{}Project.dependencies{}

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號