
# 依赖缺失和依赖冲突的解决(Java SDK)
依赖缺失和依赖冲突是 Java 开发中的常见问题，在使用[普通版本Java SDK]时，如果在应用编译和运行时报错ClassNotFoundException和 NoClassDefFoundError，可怀疑是否是依赖问题而导致，针对不同情况参照下述步骤进行排查和解决。
 #### 背景知识
Java SDK有Bundle版和普通版本，两者比较如下：
| 比较维度    | 普通版本                                                                                                                                          | Bundle版                                                                                                                                                    |
|:---|:---|:---|
| 使用场景    | 普通版本体积小，适用于空间敏感的场景                                                                                                                            | 适用于空间不敏感，依赖冲突难以修复的场景                                                                                                                                       |
| 源代码     | Bundle版本与普通版本源代码相同                                                                                                                                                                                                                                                                                        ||
| 占用空间    | 小，只包含SDK自身代码，不内置第三方依赖                                                                                                                         | 大，Bundle 版将所有三方依赖打包并重定向至包内，不再依赖外部三方包，可避免因依赖冲突导致的问题。                                                                                                        |
| Maven配置 | ``` <dependency> <groupId>com.huaweicloud</groupId> <artifactId>esdk-obs-java</artifactId> <version>versionNumber</version> </dependency> ``` | ``` <dependency> <groupId>com.huaweicloud</groupId> <artifactId>esdk-obs-java-bundle</artifactId> <version>bundleVersionNumber</version> </dependency> ``` |
   
#### 解决方法
#### 依赖缺失
通过 maven 等包管理插件引入 OBS SDK 时，包管理工具会自动下载相关依赖，其他情况下需要您自行下载依赖包并添加至工程，最新版 SDK 依赖的三方组件与版本如下：
| 依赖库名称               | 版本号    | 作用                |
|:---|:---|:---|
| okhttp              | 4.12.0 | 发送HTTP请求的组件       |
| okio                | 3.8.0  | okhttp的配套组件       |
| jackson-core        | 2.15.4 | 构建和解析JSON的组件      |
| jackson-databind    | 2.15.4 | jackson-core的配套组件 |
| jackson-annotations | 2.15.4 | jackson-core的配套组件 |
   
其他版本的依赖三方库可参考 [Maven 中心仓库](https://mvnrepository.com/artifact/com.huaweicloud/esdk-obs-java)中 SDK 的 Compile Dependencies 说明。
#### 依赖冲突
当您项目中存在多个版本的 OBS Java SDK 软件包，或多个版本的第三方依赖库时，有可能会产生依赖冲突问题。当存在旧版本 SDK 时，建议您删除旧版本软件包，升级至新版；当存在多个版本的第三方依赖库时，请将产生冲突的三方依赖替换为 SDK 的指定版本。
#### 使用 Bundle 包
当您的工程存在多种三方依赖包，或多个版本的三方依赖包而又无法删除时，可使用 Bundle 版 SDK。该 Bundle 包中打包了除了 log4j 以外的所有三方依赖（避免与用户项目中的log4j版本冲突），可以不依赖其他三方软件包直接使用，相应的，Bundle 包大小也比普通 SDK 更大，在空间敏感的场景下请评估后使用。Bundle 包的 maven 配置如下：
```
<dependency>
    <groupId>com.huaweicloud</groupId>
    <artifactId>esdk-obs-java-bundle</artifactId>
    <version>[3.24.3,)</version>
</dependency>
```
