成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Gradle 的依賴關系處理不當,可能導致你編譯異常!解決方案在此!

開發(fā) 開發(fā)工具
當我們作為一個初學者接觸 Gradle 的時候,大部分時間在使用它來添加依賴庫。而你所依賴的依賴庫,可能又依賴其他的庫,這非常的常見,這樣的情況被稱為依賴傳遞。

當我們作為一個初學者接觸 Gradle 的時候,大部分時間在使用它來添加依賴庫。而你所依賴的依賴庫,可能又依賴其他的庫,這非常的常見,這樣的情況被稱為依賴傳遞。

[[225518]]

這樣錯綜復雜的依賴關系,如果處理不好,可能達不到你預期的效果,而你有深究過嗎?

我們帶著問題來看看如何解決 Gradle 依賴關系導致的問題。

在 Android Studio 中,Gradle 構建過程對于開發(fā)者來說,很大程度上是抽象的。作為一個新的 Android 開發(fā)者,我們***次遇到 Gradle 通常是在 build.gradle 文件中添加一個遠程依賴項。

讓我們看看如何閱讀 Gradle 依賴關系樹,并解決與依賴關系有關的問題。

這是我工作中管理的一個項目,我想將 targetVersion 升級到 27,我也在 Gradle 中,更新了新版的 appcompat-v7 支持庫到***的依賴版本 27.0.2。在更改之后,同步項目,在 build.gradle 中出現(xiàn)以下錯誤提示:

該錯誤表示我必須使用完全相同版本的支持庫。可是我只在我的 build.gradle 中,使用了這個支持庫。

Android Studio 的這個提示到底是什么意思?

這個錯誤提示中,提及到的 com.android.support:animated-vector-drawable:27.0.2或com.android.support-v4:21.0.3 是在哪里又被引用了?

如果只是應用程序的直接依賴庫,只需要在 build.gradle 中指明依賴就好了,這樣非常的清晰明了。但是實際情況并非如此,這些依賴關系可能會進一步擁有自己的依賴關系,這被稱為 依賴傳遞 。Gradle 需要在應用中包含所有的直接或者間接的依賴。

前面 Android Studio 提示的錯誤信息,正是我們現(xiàn)在討論的這些傳遞性依賴關系導致的。

Gradle 必須解決所有的這些依賴關系。包含使用了哪些庫?如果兩個不同的庫對同一個庫有不同版本的依賴關系,會發(fā)生什么問題?

要查看 Gradle 依賴關系樹(Gradle 解析依賴關系的方式),我們可以到位于 Android Studio 底部的 Terminal 選項卡并輸入以下命令:

  1. gradlew app:dependencies 

這將顯示所有 構建變體 的依賴關系解析樹。我們可以在上面的命令中添加一個標識來查看特定構建變體的配置。例如 --configuration releaseCompileClasspath將向我們展示 release 變體的依賴樹。

關于構建變體,建議閱讀官方文檔:

https://developer.android.com/studio/build/build-variants.html

以上是上述命令的輸出:

  1. releaseCompileClasspath - Resolved configuration for compilation for variant: release 
  2. +--- com.android.databinding:library:1.3.1 
  3. |    +--- com.android.support:support-v4:21.0.3 
  4. |    |    \--- com.android.support:support-annotations:21.0.3 -> 27.0.2 
  5. |    \--- com.android.databinding:baseLibrary:2.3.0-dev -> 3.0.1 
  6. +--- com.android.databinding:baseLibrary:3.0.1 
  7. +--- com.android.databinding:adapters:1.3.1 
  8. |    +--- com.android.databinding:library:1.3 -> 1.3.1 (*) 
  9. |    \--- com.android.databinding:baseLibrary:2.3.0-dev -> 3.0.1 
  10. +--- com.android.support.constraint:constraint-layout:1.0.2 
  11. |    \--- com.android.support.constraint:constraint-layout-solver:1.0.2 
  12. \--- com.android.support:appcompat-v7:27.0.2 
  13.      +--- com.android.support:support-annotations:27.0.2 
  14.      +--- com.android.support:support-core-utils:27.0.2 
  15.      |    +--- com.android.support:support-annotations:27.0.2 
  16.      |    \--- com.android.support:support-compat:27.0.2 
  17.      |         +--- com.android.support:support-annotations:27.0.2 
  18.      |         \--- android.arch.lifecycle:runtime:1.0.3 
  19.      |              +--- android.arch.lifecycle:common:1.0.3 
  20.      |              \--- android.arch.core:common:1.0.0 
  21.      +--- com.android.support:support-fragment:27.0.2 
  22.      |    +--- com.android.support:support-compat:27.0.2 (*) 
  23.      |    +--- com.android.support:support-core-ui:27.0.2 
  24.      |    |    +--- com.android.support:support-annotations:27.0.2 
  25.      |    |    \--- com.android.support:support-compat:27.0.2 (*) 
  26.      |    +--- com.android.support:support-core-utils:27.0.2 (*) 
  27.      |    \--- com.android.support:support-annotations:27.0.2 
  28.      +--- com.android.support:support-vector-drawable:27.0.2 
  29.      |    +--- com.android.support:support-annotations:27.0.2 
  30.      |    \--- com.android.support:support-compat:27.0.2 (*) 
  31.      \--- com.android.support:animated-vector-drawable:27.0.2 
  32.           +--- com.android.support:support-vector-drawable:27.0.2 (*) 
  33.           \--- com.android.support:support-core-ui:27.0.2 (*) 

在查找目的之前,理解 Gradle 依賴關系樹的格式很重要。

先來談談以下三個符號,它們的目的僅用于格式化:

  • +- - - 是依賴分支庫的開始。
  • |  標識還是在之前的依賴庫中的依賴,顯示它依賴的庫。
  • \- - - 是依賴庫的末尾。

星號(*) 在依賴庫的末尾,意味著該庫的進一步依賴關系不會顯示,因為它們已經(jīng)列在其他某個子依賴樹中。

最重要的標識是 -> 。

如果 Gradle 發(fā)現(xiàn)多個依賴庫都依賴到同一個庫但是不同版本,那么它必須做出選擇。畢竟包含同一個庫的不同版本是沒有意義的。在這種情況下,Gradle 默認選擇該庫的***版本。

例如:

  1. | + — — com.android.support:support-v4:21.0.3 
  2. | | \ — — com.android.support:support-annotations:21.0.3 -> 27.0.2 

在上面,Gradle 告訴說,在 support-v4:21.0.3 依賴關系樹中, support-annotations:21.0.3 依賴于更新的版本 support-annotations:27.0.2 ,所以 27.0.2 將被使用。

現(xiàn)在我們知道如何閱讀 Gradle 依賴關系解析樹,我們回到本文的核心問題:所有 com.android.support 庫必須使用完全相同的版本。

所有支持庫都屬于以下組 com.android.support。正如我們在 Gradle 的依賴關系樹中看到的那樣,com.android.support:support-v4:21.0.3 是唯一具有版本 21.0.3 并且未解析到***版本的支持庫 27.0.2,這就是造成沖突的原因。

如何解決這個問題?有幾種方式,可以做到這一點:

1、通過 ResolutionStrategy

通過 ResolutionStrategy 強制指定 Gradle 的版本。

  1. android { 
  2.         configurations.all { 
  3.         // To resolve the conflict for com.android.databinding:library:1.3.1 
  4.         // dependency on support-v4:21.0.3         
  5.         resolutionStrategy.force 'com.android.support:support-v4:27.0.2' 
  6.     } 

關于 ResolutionStrategy 的具體細節(jié),官方文檔中有詳細描述:

https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.ResolutionStrategy.html

2、在 build.gradle 中指明版本

要在 build.gradle  中,明確指定添加的是 com.android.support:support-v4:27.0.2。這將讓Gradle 覆蓋舊版本。

  1. dependencies { 
  2.     implementation fileTree(dir: 'libs', include: ['*.jar']) 
  3.     implementation 'com.android.support.constraint:constraint-layout:1.0.2' 
  4.     // To resolve the conflict for com.android.databinding:library:1.3.1 
  5.     // dependency on support-v4:21.0.3 
  6.     implementation 'com.android.support:support-v4:27.0.2' 
  7.     implementation 'com.android.support:appcompat-v7:27.0.2' 

對我來說,在 build.gradle 中顯式添加依賴關系似乎更加的自然,并且可以留下注釋。當我們再次更新庫來檢查它是否仍然需要顯式添加時,這個注釋將提醒我關注它。

一旦添加并進行項目同步之后,錯誤文本將消失。現(xiàn)在,如果我們再次運行依賴關系命令,我們將看到support-v4:21.0.3解決-> 27.0.2。

大部分時候 Gradle 會正確解決依賴關系。而了解了 Gradle 的依賴關系,我想遇到這樣的問題我們應該更清楚如何去解決它。

【本文為51CTO專欄作者“張旸”的原創(chuàng)稿件,轉載請通過微信公眾號聯(lián)系作者獲取授權】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2009-11-06 15:25:25

WCF異常

2012-01-11 10:55:02

ASP.NET MVC

2024-10-14 08:29:14

異步編程任務

2020-09-04 13:50:35

前端異常監(jiān)控代碼

2010-01-06 09:12:50

交換機安裝不當故障

2018-09-14 16:20:37

2017-06-01 11:17:57

Python異常重試解決方案

2009-06-17 11:47:21

Hibernate 刪

2010-02-24 14:05:08

WCF openati

2013-05-14 15:47:27

MySQL監(jiān)控錯誤日志

2010-01-07 13:38:09

交換機故障

2012-05-30 15:40:16

大并發(fā)并發(fā)解決方案

2010-02-26 15:46:48

Silverlight

2019-09-23 11:07:00

PythonRedis軟件

2012-05-25 10:37:06

Tomcat部署JspFactory

2010-06-09 08:49:54

IBM SSCT

2018-03-26 12:58:52

數(shù)據(jù)庫OracleMySQL

2010-01-06 09:37:06

華為交換機故障

2023-07-18 14:05:30

鴻蒙

2012-02-01 10:50:49

JavaWeb報表
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美中文字幕一区二区三区 | 国外成人在线视频网站 | 日本超碰| 国产精品美女久久久久久免费 | japan25hdxxxx日本 做a的各种视频 | 日韩免费一区二区 | 欧美日韩专区 | 亚洲欧美国产精品一区二区 | 日本天天操 | 国产黄色在线观看 | 精品国产乱码久久久久久丨区2区 | 夜夜草视频 | 精品国产91 | 国产91网站在线观看 | 午夜精品久久久久久久 | 亚洲成人三级 | 久久国产综合 | 免费的黄色片子 | 成人中文网 | 免费视频一区 | 伊人精品视频 | 国产精品免费在线 | 久久久人| 精品久久久久久久 | 91久久久久久久久久久 | 午夜影院在线观看免费 | 亚洲欧美综合精品久久成人 | 亚洲精品综合 | 免费在线观看成年人视频 | 精品免费视频一区二区 | 99精品视频在线观看免费播放 | 国产精品亚洲欧美日韩一区在线 | 亚洲精品一区二区另类图片 | 成人高清在线视频 | 亚洲精品一二区 | 国产精品视频免费观看 | 伊人精品在线视频 | 国产一级一级毛片 | 久久精品女人天堂av | 国产在线精品免费 | 久久精品中文字幕 |