如需确保项目具有兼容的 Cloud 客户端库版本,请使用 Google Cloud库物料清单 (BOM) 中指定的版本。BOM 中的库没有表现为 NoSuchMethodError 或 NoClassDefFoundError 的依赖项冲突。
BOM 是必需的,因为 Google 发布了 200 多个开源 Java 库,使得在 Google Cloud中使用服务更轻松。Google Cloud 库依赖于几个可用于一般用途的基础库。
这些建议适用于以下库的组件:
更新项目以使用 BOM
如需确保项目使用兼容版本的库及其组件工件,请导入 com.google.cloud:libraries-bom 并使用 BOM 指定依赖项版本。请务必移除您之前设置的所有版本。
如果您遇到与 protobuf-java 4.x 的兼容性问题,请更新您的代码库和依赖项以确保兼容性。如需了解潜在的兼容性问题,请参阅 libraries-bom v26.50.0 的版本说明。如果不可行,请使用 com.google.cloud:libraries-bom-protobuf3 作为权宜解决方法。
com.google.cloud:libraries-bom-protobuf3 包含与 libraries-bom 相同的客户端库和库版本。
Maven
在 pom.xml 文件的 dependencyManagement 部分中导入 BOM。在 dependencies 部分中添加您依赖的特定制品,但不在 dependencies 部分中指定制品的版本。以下示例展示了如何导入 BOM 并包含 google-cloud-storage 制品。
在本示例中,由于 BOM 管理库版本,因此省略了 google-cloud-storage 的版本。
Gradle
Gradle 5.x 或更高版本默认支持 BOM。添加 com.google.cloud:libraries-bom 的 platform 依赖项,并从工件的 build.gradle 文件中移除依赖项声明。
platform 和 enforcedPlatform 关键字提供在 BOM 中声明的依赖项版本。enforcedPlatform 关键字会强制执行在 BOM 中声明的依赖项版本,从而替换您指定的内容。如需详细了解 platform 和 enforcedPlatform 关键字 Gradle 5.x 或更高版本,请参阅 Gradle:导入 Maven BOM。
如果您使用的是 Gradle 4.6 或更高版本,请将 enableFeaturePreview('IMPROVED_POM_SUPPORT') 添加到 settings.gradle 文件。如需了解详情,请参阅 Gradle 4.6 版本说明:BOM 导入。低于 4.6 的 Gradle 版本不支持 BOM。
SBT
SBT 不支持 BOM。您可以在信息中心找到特定 BOM 版本的库的推荐版本,并手动设置版本。
Bazel
Bazel 不支持 BOM。您可以在信息中心找到特定 BOM 版本的库的建议版本,并手动设置版本。
Guava 版本 -jre 或 -android
自从发布 21.0.0 版以来,库 BOM 包含 Guava 的 -jre 版本(支持 Java 8+)。以下部分不适用于 Java 8 用户。
Google 的 Guava 版本包含两种版本的制品:“-jre”和“-android”版本。带有“-jre”的类(例如 com.google.guava:guava:31.1-jre)适用于 Java 8,并且支持 lambda 函数和流。另一个带有“-android”后缀的版本(例如 com.google.guava:guava:31.1-android)适用于 Java 7 和 Android 开发。
Google Cloud 库 BOM 包含具有“-android”版本的 Guava,以确保该 BOM 适用于 Java 7。但是,这意味着 BOM 中的 Guava 版本没有一些适用于 Java 8 lambda 函数的方法,例如 ImmutableList.toImmutableList()。
如果您的项目需要 Java 8 或更高版本并使用 Guava 类(例如 com.google.common.collect.Streams),则应在 Guava 的 JRE 版本中添加依赖项。
在 Maven 中:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.1-jre</version> <!-- "-jre" for Java 8 or higher -->
</dependency>
</dependencies>
<dependencies>
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>libraries-bom</artifactId>
...
</dependencyManagement>
在 Gradle 中:
dependencies {
constraints {
implementation 'com.google.guava:guava:31.1-jre' // "-jre" for Java 8 or higher
}
implementation platform('com.google.cloud:libraries-bom:26.12.0')
...
}
如果您使用 enforcedPlatform,则上一个示例不起作用,因为 enforcedPlatform 优先于 constraints。如果您想要将 enforcedPlatform 与 Guava 版本搭配使用,则可以配置 ResolutionStrategy。