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

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

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

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

更新项目以使用 BOM

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

如果您遇到与 protobuf-java 4.x 的兼容性问题,请更新您的代码库和依赖项以确保兼容性。如需了解潜在的兼容性问题,请参阅 libraries-bom v26.50.0libraries-bom v26.75.0 的版本说明。

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.75.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.75.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 开发。

Cloud de Confiance 库 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