使用 Cloud 客户端库

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

BOM 是必需的,因为 Google 发布了 200 多个开源 Java 库,使得在 Google Cloud 中使用服务更轻松地。Google Cloud 库依赖于几个可用于一般用途的基础库。

这些建议适用于以下库的组件:

更新项目以使用 BOM

如需确保项目使用兼容版本的库及其组件工件,请导入 com.google.cloud:libraries-bom 并使用 BOM 指定依赖项版本。请务必移除您之前设置的所有版本。

Maven

pom.xml 文件的 dependencyManagement 部分中导入 BOM。在 dependencies 部分中添加您依赖的特定工件,但不在 dependencies 部分中指定工件的版本。

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>com.google.cloud</groupId>
        <artifactId>libraries-bom</artifactId>
        <version>25.4.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.guava</groupId>
      <artifactId>guava</artifactId>
    </dependency>
  </dependencies>

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

Gradle

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

dependencies {
  implementation platform('com.google.cloud:libraries-bom:25.4.0')
  implementation 'com.google.cloud:google-cloud-storage'
  implementation 'com.google.guava:guava'
}

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:25.4.0')
  ...
}

如果您使用 enforcedPlatform,则上一个示例不起作用,因为 enforcedPlatform 优先于 constraints。如果您想要将 enforcedPlatform 与 Guava 变体搭配使用,则可以配置 ResolutionStrategy