Menggunakan Bill of Materials (BOM) dengan Library Klien Cloud untuk Java

Untuk memastikan bahwa project Anda memiliki versi Cloud Client Libraries yang kompatibel, gunakan versi yang ditentukan dalam Google Cloud Bill of Materials (BOM) Library. Library dalam BOM tidak memiliki konflik dependensi yang akan terwujud sebagai NoSuchMethodError atau NoClassDefFoundError.

BOM diperlukan karena Google memublikasikan lebih dari dua ratus library Java open source yang mempermudah penggunaan layanan di Google Cloud. Library Google Cloud bergantung pada beberapa library dasar yang dapat digunakan untuk tujuan umum.

Rekomendasi ini berlaku untuk komponen library berikut:

Memperbarui project untuk menggunakan BOM

Untuk memastikan bahwa project Anda menggunakan versi library dan artefak komponen yang kompatibel, impor com.google.cloud:libraries-bom dan gunakan BOM untuk menentukan versi dependensi. Pastikan untuk menghapus versi yang Anda tetapkan sebelumnya.

Jika Anda mengalami masalah kompatibilitas dengan protobuf-java 4.x, update codebase dan dependensi Anda untuk memastikan kompatibilitas. Lihat catatan rilis libraries-bom v26.50.0 untuk mengetahui potensi masalah kompatibilitas. Jika hal ini tidak memungkinkan, gunakan com.google.cloud:libraries-bom-protobuf3 sebagai solusinya. com.google.cloud:libraries-bom-protobuf3 mencakup library klien dan versi library yang sama dengan libraries-bom.

Maven

Impor BOM di bagian dependencyManagement pada file pom.xml Anda. Sertakan artefak spesifik yang Anda andalkan di bagian dependencies, tetapi jangan tentukan versi artefak di bagian dependencies. Contoh di bawah ini menunjukkan cara mengimpor BOM dan menyertakan artefak 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>

Dalam contoh ini, karena BOM mengelola versi library, versi google-cloud-storage tidak disertakan.

Gradle

BOM didukung secara default di Gradle 5.x atau yang lebih baru. Tambahkan dependensi platform pada com.google.cloud:libraries-bom dan hapus versi dari deklarasi dependensi dalam file build.gradle artefak.

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

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

Kata kunci platform dan enforcedPlatform menyediakan versi dependensi yang dideklarasikan dalam BOM. Kata kunci enforcedPlatform menerapkan versi dependensi yang dideklarasikan dalam BOM dan dengan demikian menggantikan apa yang Anda tentukan. Untuk mengetahui detail selengkapnya tentang kata kunci platform dan enforcedPlatform Gradle 5.x atau yang lebih tinggi, lihat Gradle: Mengimpor BOM Maven.

Jika Anda menggunakan Gradle 4.6 atau yang lebih baru, tambahkan enableFeaturePreview('IMPROVED_POM_SUPPORT') ke file settings.gradle Anda. Untuk mengetahui detailnya, lihat Catatan Rilis Gradle 4.6: Impor BOM. Gradle versi sebelum 4.6 tidak mendukung BOM.

SBT

SBT tidak mendukung BOM. Anda dapat menemukan versi library yang direkomendasikan dari versi BOM tertentu di dasbor dan menetapkan versi secara manual.

Bazel

Bazel tidak mendukung BOM. Anda dapat menemukan versi library yang direkomendasikan dari versi BOM tertentu di dasbor dan menetapkan versi secara manual.

Versi Guava -jre atau -android

Sejak rilis versi 21.0.0, BOM Library menyertakan versi -jre Guava (yang mendukung Java 8+). Bagian di bawah tidak berlaku untuk pengguna Java 8.


Rilis Guava Google berisi dua versi artefak: versi "-jre" dan "-android". Yang memiliki "-jre" (seperti com.google.guava:guava:31.1-jre) adalah untuk Java 8 dan mendukung fungsi lambda dan stream. Versi lain dengan akhiran "-android" (seperti com.google.guava:guava:31.1-android) adalah untuk pengembangan Java 7 dan Android.

Google Cloud BOM Library berisi Guava dengan versi "-android" untuk memastikan bahwa BOM berfungsi di Java 7. Namun, hal ini berarti versi Guava di BOM tidak memiliki beberapa metode yang ditujukan untuk fungsi lambda Java 8, seperti ImmutableList.toImmutableList().

Jika project Anda memerlukan Java 8 atau yang lebih baru dan menggunakan class Guava seperti com.google.common.collect.Streams, Anda harus menambahkan dependensi pada Guava versi JRE.

Di 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>

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

Contoh sebelumnya tidak berfungsi jika Anda menggunakan enforcedPlatform karena enforcedPlatform lebih diutamakan daripada constraints. Jika ingin menggunakan enforcedPlatform dengan versi Guava, Anda dapat mengonfigurasi ResolutionStrategy.