

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 如何解決相依性衝突？
<a name="ts-faq-dep-conflict-resolution"></a>

當您使用 時 適用於 Kotlin 的 AWS SDK，它需要特定 AWS 和第三方相依性才能正常運作。如果這些相依性在執行時間遺失或未預期的版本，您可能會看到 `NoSuchMethodError`或 等錯誤`NoClassDefFoundError`。這些相依性問題通常分為兩個群組：
+ SDK/Smithy 相依性衝突
+ 第三方相依性衝突

當您建置 Kotlin 應用程式時，可能會使用 Gradle 來管理相依性。在 SDK 服務用戶端上新增相依性到您的專案，會自動包含所有必要的相關相依性。不過，如果您的應用程式有其他相依性，它們可能會與 SDK 所需的相依性衝突。例如，開發套件依賴 OkHttp，這是您的應用程式可能也會使用的熱門 HTTP 用戶端。為了協助您發現這些衝突，Gradle 提供便利的任務，列出專案的相依性：

```
./gradlew dependencies
```

當您遇到相依性衝突時，您可能需要採取動作。您可以在本機命名空間中指定特定版本的相依性或影子相依性。Gradle 相依性解析是一個複雜的主題，在 *Gradle 使用者手冊*的下列章節中進行了討論：
+ [ 了解相依性解析 ](https://docs.gradle.org/current/userguide/dependency_resolution.html)
+ [ 相依性限制和衝突解決 ](https://docs.gradle.org/current/userguide/dependency_constraints_conflicts.html)
+ [ 對齊相依性版本 ](https://docs.gradle.org/current/userguide/dependency_version_alignment.html)

## 在專案中管理 SDK 和 Smithy 相依性
<a name="sdk-smithy-dep-conflicts"></a>

當您使用 SDK 時，請記住，其模組通常依賴其他版本編號相符的 SDK 模組。例如， `aws.sdk.kotlin:s3:1.2.3`取決於 `ws.sdk.kotlin:aws-http:1.2.3`，這取決於 `aws.sdk.kotlin:aws-core:1.2.3`，以此類推。

開發套件模組也會使用特定的 Smithy 模組版本。雖然 Smithy 模組版本不會與 SDK 版本編號同步，但它們必須符合 SDK 的預期版本。例如， `aws.sdk.kotlin:s3:1.2.3`可能取決於 `aws.smithy.kotlin:serde:1.1.1`，這取決於 `aws.smithy.kotlin:runtime-core:1.1.1`，以此類推。

若要避免相依性衝突，請將所有 SDK 相依性一起升級，並針對任何明確的 Smithy 相依性執行相同的動作。考慮使用我們的 [Gradle 版本目錄](setup-create-project-file.md)來保持版本同步，並消除 SDK 和 Smithy 版本之間的映射猜測。

請記住，SDK/Smithy 模組中的次要版本更新可能包括重大變更，如我們的[版本控制政策](https://github.com/awslabs/aws-sdk-kotlin/blob/main/VERSIONING.md#versioning-policy)所述。在次要版本之間升級時，請仔細檢閱變更日誌並徹底測試執行時間行為。

## 解決應用程式中的 OkHttp 版本衝突
<a name="okhttp-dep-conflicts"></a>

[OkHttp](https://square.github.io/okhttp/) 是開發套件預設在 JVM 上使用的熱門 HTTP 引擎。您的應用程式可能包含具有不同 OkHttp 版本的其他相依性或架構。這可能會導致`okhttp3`命名空間中`NoClassDefFoundError`類別的 ，例如 `okhttp/coroutines/ExecuteAsyncKt`或 `okhttp3/ConnectionListener`。發生這種情況時，您通常應該選擇較新的版本來解決衝突。為了協助您追蹤這些衝突的來源，Gradle 提供了有用的任務。您可以執行下列動作來列出所有相依性：

```
./gradlew dependencies
```

例如，如果 SDK 依賴 OkHttp，`5.0.0-alpha.14`而 Spring Boot 等其他相依性依賴 OkHttp`4.12.0`，則您應該使用 `5.0.0-alpha.14 version`。您可以使用 Gradle 中的`constraints`區塊來執行此操作：

```
dependencies {
    constraints {
        implementation("com.squareup.okhttp3:okhttp:4.12.0")
    }
}
```

或者，如果您必須使用 OkHttp 4.x，開發套件會提供 `OkHttp4Engine`。如需如何在程式碼`OkHttp4Engine`中設定 Gradle 和使用 的資訊，請參閱 [文件](https://github.com/smithy-lang/smithy-kotlin/tree/main/runtime/protocol/http-client-engines/http-client-engine-okhttp4)。