将 Cloud 客户端库与 Java 版的 BOM 搭配使用

如需确保项目具有兼容的 Cloud 客户端库版本,请使用 Google Cloud库物料清单 (BOM) 中指定的版本。BOM 中的库没有表现为 NoSuchMethodErrorNoClassDefFoundError 的依赖项冲突。

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 制品。

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>libraries-bom</artifactId>
      <version>26.73.0</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

<dependencies>
  <dependency>
    <groupId>com.google.cloud</groupId>
    <artifactId>google-cloud-storage</artifactId>
  </dependency>
  <dependency>
    <groupId>com.google.cloud</groupId>
    <artifactId>google-cloud-storage-control</artifactId>
  </dependency>
</dependencies>

在本示例中,由于 BOM 管理库版本,因此省略了 google-cloud-storage 的版本。

Gradle

Gradle 5.x 或更高版本默认支持 BOM。添加 com.google.cloud:libraries-bomplatform 依赖项,并从工件的 build.gradle 文件中移除依赖项声明。

implementation platform('com.google.cloud:libraries-bom:26.72.0')

implementation 'com.google.cloud:google-cloud-storage'

platformenforcedPlatform 关键字提供在 BOM 中声明的依赖项版本。enforcedPlatform 关键字会强制执行在 BOM 中声明的依赖项版本,从而替换您指定的内容。如需详细了解 platformenforcedPlatform 关键字 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