Java Gradle入門指南之依賴管理(添加依賴、倉庫、版本衝突)

来源:http://www.cnblogs.com/gzdaijie/archive/2016/03/19/5296624.html
-Advertisement-
Play Games

& 160;& 160;& 160;& 160;開發任何軟體,如何管理依賴是一道繞不過去的坎,軟體開發過程中,我們往往會使用這樣那樣的第三方庫,這個時候,一個好的依賴管理就顯得尤為重要了。作為一個自動構建工作,Gradle對依賴管理有著很好的支持。 & 160;& 160;& 160;& 160;通


    開發任何軟體,如何管理依賴是一道繞不過去的坎,軟體開發過程中,我們往往會使用這樣那樣的第三方庫,這個時候,一個好的依賴管理就顯得尤為重要了。作為一個自動構建工作,Gradle對依賴管理有著很好的支持。
    通常我們使用IDE(Eclipse、IDEA、Android Studio)開發Java項目,IDE自動為我們創建了Gradle文件,添加依賴也不過簡單的幾行代碼,這篇隨筆將從逐步解釋Gradle的依賴管理方法,希望對大家有所幫助。
    如有錯誤,請不吝指出,非常感謝!如果本文對你有幫助,右下角點個推薦吧~

1.添加依賴包名

1.1 依賴類型

  • 常見的依賴包含兩種類型。

    (1) 一類是項目中所需要的庫,包括本地/倉庫中的文件和其他項目文件(例如一個多項目工程,一個項目依賴於另一個項目)

    (2) 一類是實現自動化編譯、部署等所需的庫,包含Gradle的API和Groovy編寫的Task、Plugin等,這一類依賴在前2篇隨筆有提到和使用

1.2 聲明依賴

  • 聲明依賴使用下麵的閉包
dependencies {
    <configuration name> <dependencies>
}

1.3 添加java依賴

  • 在這裡,我們以構建java項目為例,構建java項目首先需要應用java插件,插件的使用可參考上一篇隨筆Java Gradle之插件管理

  • java插件針對不同操作,將依賴分為10類(詳見 java plugin 45.5),下麵介紹常用的5類

    (1) compile:源代碼(src/main/java)編譯時的依賴,最常用
    (2) runtime:源代碼(src/main/java)執行時依賴
    (3) testCompile:測試代碼(src/main/test)編譯時的依賴
    (4) testRuntime:測試代碼(src/main/java)執行時的依賴

    (5) archives:項目打包(e.g.jar)時的依賴

  • 通常,一個JAR依賴需包含JAR文件組(group/命名空間)、JAR文件名(name)、JAR文件版本(version),特殊情況下還可指定JDK版本。添加依賴可以有以下方式:

/* 單個依賴 */
compile group:'log4j', name:'log4j', version:'1.2.17'
// 簡寫 => compile 'log4j:log4j:1.2.17'

/* 以數組形式添加多個依賴*/
compile 'joda-time:joda-time:2.9.2', 'log4j:log4j:1.2.17'

/* 閉包形式,以添加額外配置*/
compile (group:'log4j', name:'log4j', version:'1.2.17'){
    // ... 額外配置
}
/* 等價於 */
compile ('log4j:log4j:1.2.17'){
    // ... 額外配置
}

1.4 查找依賴包名

  • 點擊maven網站
  • 搜索需要導入的包,例如gson,點擊對應版本,例如2.6.2
  • 選擇gradle,將會出現'com.google.code.gson:gson:2.6.2'
  • 複製 & 粘貼

1.5 完整的例子

// sourceCompatibility = 1.8為java版本,預設為當前JVM版本
apply plugin: 'java'

sourceCompatibility = 1.8
version = '1.0'

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.springframework:spring-context:4.2.1.RELEASE'
    compile 'log4j:log4j:1.2.17'
}
  • repositories{ ... } 是放置這些包的倉庫,接下來介紹
  • sourceCompatibility、version只是java plugin的部分屬性,更多請看 java plugin 45.8

2.添加依賴倉庫

    你可能會疑惑,聲明瞭這些依賴,這些依賴是在哪裡找到的呢?repositories定義了下載依賴的倉庫

/* Maven Central respoitory */
repositories {
    mavenCentral()
}
/* Maven JCenter respoitory */
repositories {
    jcenter()
}
/* Maven local respoitory */
/* 本地倉庫是之前下載的依賴,緩存在本地磁碟*/
repositories {
    mavenLocal() 
}
  • 不需要記住倉庫的地址,直接使用即可,多個倉庫可以同時用,通常我們會將遠程倉庫與本地倉庫一起使用,因為緩存在本地磁碟上的文件速度更快,不需要重覆下載。
  • 關於jcentermavenCentral的區別,推薦看stackoverflow的回答
  • 當然,國外的倉庫在國內使用速度可能會比較慢,Gradle支持自定義地址,例如公司的倉庫地址、國內倉庫鏡像地址等。
repositories {
    mavenLocal() 
    /* 指定本地倉庫地址 */
    maven { url "file://E:/githubrepo/releases" }
    /* 指定的遠程倉庫 */
    maven { url "http://mvnrepository.com/" }
    /* 
     * 公司倉庫,可能需要驗證
     * 不推薦直接將用戶名密碼寫在build.gradle中
     * 可以寫在~/.gradle/gradle.properties中,再使用
     */
    maven {
        url "<you_company_resp_url>"
        credentials {
            username 'your_username'
            password 'your_password'
        }
    }
    // 支持ivy倉庫
    ivy { url "<ivy_resp_url>" }
}
  • 有時,我們需要調用自己編譯實現的*.jar,我們也可以將包含這些文件的文件夾(不同於mavenLocal)映射為一個倉庫,但一般不推薦這樣做
repositories {
    flatDir {  dirs 'libs1/java/...','libs2' }
}

3.依賴常見問題

3.1 依賴傳遞性

  • 很多庫依賴於其他庫,例如a.jar依賴b.jar,在Gradle中,只需添加a.jar即可,Gradle將自動把a依賴的所有庫全部下載。
  • 但是,有時你並不想讓Gradle自動去做這件事情,比如你希望明明白白地知道添加哪些庫,可以配置transitive實現,編譯時報錯,你就可以知道進一步需添加哪些庫。
dependencies {
    // transitive 屬性預設為 true
    compile group:'log4j',name:'log4j',version:'1.2.17',transitive:false
}
  • 另一種情況是,依賴傳遞可能會導致版本衝突,即依賴傳遞下載的庫可能與項目依賴的另一個庫版本衝突,這種情況下可以排除一些庫,而下載其他所有的依賴庫,即選擇性排除。
dependencies {
    compile ('commons-httpclient:commons-httpclient:3.1'){
        exclude group:'commons-codec' //排除該group的依賴
        // exclude group:'commons-codec',module:'commons-codec'
        // group是必選項,module可選
    }
}

3.2 版本衝突

  • 版本衝突時十分常見的,比如下麵的例子
// 庫 a 傳遞性依賴庫 b-1.2,與添加的b-1.1衝突
dependencies {
    compile 'a:a:1.0'
    compile 'b:b:1.1'
}
  • Gradle解決衝突有以下幾種方式

    (1) 最近版本策略(預設):上例將忽略b-1.1,而下載b-1.2
    (2) 衝突失敗策略:發生衝突時,編譯失敗(有些新版本庫並不相容之前的,因此這個庫可以讓開發者主動作出選擇)

    (3) 強制指定版本策略:發生衝突時,使用開發者指定的版本

/* 衝突失敗策略設置*/
configurations.all {
    resolutionStrategy {  failOnVersionConflict() }
}
/* 強制指定版本策略設置*/
dependencies {
    compile group:'b',name:'b',version:'1.1',force:true
}

3.3 動態依賴

  • 動態依賴增加了庫版本依賴時的靈活性
dependencies {
    /* 選擇1以上任意一個版本,這使發生版本衝突的幾率變小*/
    compile group:'b',name:'b',version:'1.+'
    /* 選擇最新的版本,避免直接指定版本號 */
    compile group:'a',name:'a',version:'latest.integration'
}

3.4 更多設置

  • 指定庫文件類型
// ext 預設jar,可選屬性為war、zip
compile group:'b',name:'b',version:'1.1',ext:'war'
  • 使用分類器(classifiers)
// 例如提供了2種包,a-1.0-dev.war, a-1.0-dev.jar
compile group:'b',name:'b',version:'1.1',classifier:'dev',ext:'war'
  • 替換傳遞依賴的版本
compile group:'a',name:'a',version:'l.0' {
    dependencies 'b:b:1.1'
}
  • 常用命令
(1) 查看所有依賴庫
gradle dependencies
(2) 查看指定配置(詳見 1.3)的依賴庫
gradle dependencies -configuration <configuration>
例 gradle dependencies -configuration compile => 查看編譯時依賴
例 gradle dependencies -configuration runtime => 查看運行時依賴

    分享創建價值,歡迎關註&留言~


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

-Advertisement-
Play Games
更多相關文章
  • 練習教科書第22~25頁單元測試練習,要求自行安裝Visual Studio開發平臺,版本至少在2010以上,要求把程式安裝過程和練習過程寫到博客上,越詳細越好,要圖文並茂,沒有書的同學可以向班內助教同學借閱。 單元測試: 首先新建項目->visual C# 類庫 然後輸入單元測試代碼: 如圖1.1
  • 對於一個企業級項目開發,模塊化是非常重要的。 預設Mvc框架的AreaRegistration對模塊化開發真的支持很好嗎?真的有很多複雜系統在使用預設的分區開發的嗎?我相信大部分asp.net的技術團隊最開始都研究過分區,甚至在實際項目裡面有嘗試運用,但是碰到了種種問題"各種坑",最後回頭是岸放棄了
  • 要求:共1000條數據,第一次批量插入100條,第二次批量插入101到200條,依次插入數據; 實現方式這裡選擇了兩種常用的方式,都是使用List操作; 第一種實現思路如下: <1> 原先存放數據的List為recordList,求出共需批量處理的次數; <2> 新建一個List為list,迴圈後,
  • 利用PBFunc工具在Powerbuilder解析json,只需要調用getattribute方法來獲取 ls_val返回為 朵朵貝貝嬰兒鞋 解析後的結果 demo下載地址:http://download.csdn.net/detail/my_aa/9465068
  • 閱讀目錄 Spring整合Hibernate有什麼好處? 1、由IOC容器來管理Hibernate的SessionFactory 2、讓Hibernate使用上Spring的聲明式事務 整合前準備: 持久化類: Dao層: DaoImpl: Service層: ServiceImpl:
  • 元旦快到了,校學生會讓樂樂負責新年晚會的紀念品發放工作。為使得參加晚會的同學所獲得的紀念品價值相對均衡,他要把購來的紀念品根據價格進行分組,但每組最多只能包括兩件紀念品,並且每組紀念品的價格之和不能超過一個給定的整數。為了保證在儘量短的時間內發完所有紀念品,樂樂希望分組的數目最少。 你的任務是寫一個
  • synchronized Java語言的關鍵字,可用來給對象和方法或者代碼塊加鎖,當它鎖定一個方法或者一個代碼塊的時候,同一時刻最多只有一個線程執行這段代碼。當兩個併發線程訪問同一個對象object中的這個加鎖同步代碼塊時,一個時間內只能有一個線程得到執行。另一個線程必須等待當前線程執行完這個代碼塊
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...