如需确保项目具有兼容的 Cloud 客户端库版本,请使用在 Google Cloud 库物料清单 (BOM) 中指定的版本。BOM 中的库没有表现为 NoSuchMethodError
或 NoClassDefFoundError
的依赖项冲突。
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-storage
和 guava
的版本。
Gradle
Gradle 5.x 或更高版本默认支持 BOM。添加 com.google.cloud:libraries-bom
的 platform
依赖项,并从工件的 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'
}
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:25.4.0')
...
}
如果您使用 enforcedPlatform
,则上一个示例不起作用,因为 enforcedPlatform
优先于 constraints
。如果您想要将 enforcedPlatform
与 Guava 变体搭配使用,则可以配置 ResolutionStrategy
。