互換性のあるバージョンの Cloud クライアント ライブラリがプロジェクトで使用されるようにするには、 Google Cloudライブラリの部品構成表(BOM)で指定されているバージョンを使用します。BOM 内のライブラリには、NoSuchMethodError または NoClassDefFoundError として現れる依存関係の競合はありません。
Google は 200 を超えるオープンソース Java ライブラリを公開して、 Google Cloudでサービスを簡単に使用できるようにしているため、BOM が必要です。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 で宣言された依存関係のバージョンを適用するため、指定した内容がオーバーライドされます。Gradle 5.x 以降の platform キーワードと enforcedPlatform キーワードの詳細については、Gradle: Maven BOM のインポートをご覧ください。
Gradle 4.6 以降を使用している場合は、settings.gradle ファイルに enableFeaturePreview('IMPROVED_POM_SUPPORT') を追加します。詳細については、Gradle 4.6 リリースノート: BOM のインポートをご覧ください。Gradle のバージョンが 4.6 より前の場合は、BOM をサポートしていません。
SBT
SBT では、BOM はサポートされていません。ダッシュボードで、特定の BOM バージョンから推奨されるライブラリのバージョンを見つけて、手動でバージョンを設定できます。
Bazel
Bazel は BOM をサポートしていません。ダッシュボードで、特定の BOM バージョンから推奨されるライブラリのバージョンを見つけて、手動でバージョンを設定できます。
Guava バージョン -jre または -android
バージョン 21.0.0 のリリース以降、ライブラリ BOM には Guava の -jre バージョン(Java 8 以降をサポート)が含まれています。以下のセクションは Java 8 ユーザーには適用されません。
Google の Guava リリースには、2 つのバージョンのアーティファクト(「-jre」と「-android」のバージョン)があります。「-jre」が付く方(com.google.guava:guava:31.1-jre など)は Java 8 用で、ラムダ関数とストリームをサポートします。「-android」の接尾辞が付くもう一方のバージョン(com.google.guava:guava:31.1-android など)は、Java 7 と Android 開発用です。
Google Cloud ライブラリ BOM には、Java 7 で BOM が動作するように、"-android" バージョンの Guava が含まれています。ただし、これは、BOM の Guava のバージョンに、ImmutableList.toImmutableList() などの Java 8 ラムダ関数用のメソッドが含まれていないことを意味します。
プロジェクトで Java 8 以降が必要で、com.google.common.collect.Streams などの Guava クラスを使用する場合は、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 が constraints よりも優先されるため、enforcedPlatform を使用する場合は機能しません。Guava バージョンで enforcedPlatform を使用する場合は、ResolutionStrategy を構成できます。