Utilizzare la Bill of Materials (BOM) con le librerie client di Cloud per Java

Per assicurarti che i tuoi progetti abbiano versioni compatibili delle librerie client Cloud, utilizza le versioni specificate nella Google Cloud distinta base (BOM) delle librerie. Le librerie nella distinta base non presentano conflitti di dipendenza che si manifesterebbero come NoSuchMethodError o NoClassDefFoundError.

La distinta base è necessaria perché Google pubblica oltre duecento librerie Java open source che semplificano l'utilizzo dei servizi in Google Cloud. Le Google Cloud librerie dipendono da diverse librerie di base che possono essere utilizzate per scopi generali.

Questi consigli si applicano ai componenti delle seguenti librerie:

Aggiornare il progetto per utilizzare la distinta base

Per assicurarti che i tuoi progetti utilizzino versioni compatibili delle librerie e dei relativi artefatti dei componenti, importa com.google.cloud:libraries-bom e utilizza la distinta base per specificare le versioni delle dipendenze. Assicurati di rimuovere le versioni che hai impostato in precedenza.

Se riscontri problemi di compatibilità con protobuf-java 4.x, aggiorna il codebase e le dipendenze per garantire la compatibilità. Per potenziali problemi di compatibilità, consulta le note di rilascio di libraries-bom v26.50.0 e libraries-bom v26.75.0 .

Maven

Importa la distinta base nella sezione dependencyManagement del file pom.xml. Includi gli artefatti specifici da cui dipendi nella sezione dependencies, ma non specificare le versioni degli artefatti nella sezione dependencies. L'esempio seguente mostra come importare la distinta base e includere l'artefatto google-cloud-storage.

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

In questo esempio, poiché la distinta base gestisce le versioni delle librerie, la versione di google-cloud-storage viene omessa.

Gradle

Le distinte base sono supportate per impostazione predefinita in Gradle 5.x o versioni successive. Aggiungi una dipendenza platform su com.google.cloud:libraries-bom e rimuovi la versione dalle dichiarazioni di dipendenza nel file build.gradle dell'artefatto.

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

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

Le parole chiave platform e enforcedPlatform forniscono le versioni delle dipendenze dichiarate in una distinta base. La parola chiave enforcedPlatform applica le versioni delle dipendenze dichiarate nella distinta base e pertanto sostituisce quelle specificate. Per ulteriori dettagli sulle parole chiave platform e enforcedPlatform di Gradle 5.x o versioni successive, consulta Gradle: Importing Maven BOMs.

Se utilizzi Gradle 4.6 o versioni successive, aggiungi enableFeaturePreview('IMPROVED_POM_SUPPORT') al file settings.gradle. Per maggiori dettagli, consulta le note di rilascio di Gradle 4.6: BOM import. Le versioni di Gradle precedenti alla 4.6 non supportano le distinte base.

SBT

SBT non supporta le distinte base. Puoi trovare le versioni consigliate delle librerie da una determinata versione della distinta base nella dashboard e impostare le versioni manualmente.

Bazel

Bazel non supporta le distinte base. Puoi trovare le versioni consigliate delle librerie da una determinata versione della distinta base nella dashboard e impostare le versioni manualmente.

Versioni di Guava -jre o -android

Dalla release della versione 21.0.0, la distinta base delle librerie include la versione -jre di Guava (che supporta Java 8 e versioni successive). La sezione seguente non è applicabile agli utenti di Java 8.


La release di Guava di Google contiene due versioni di artefatti: le versioni "-jre" e "-android". Quella con "-jre" (ad esempio com.google.guava:guava:31.1-jre) è per Java 8 e supporta le funzioni lambda e gli stream. L'altra versione con il suffisso "-android" (ad esempio com.google.guava:guava:31.1-android) è per lo sviluppo di Java 7 e Android.

La distinta base delle Google Cloud librerie contiene Guava con la versione "-android" per assicurarsi che funzioni in Java 7. Tuttavia, ciò significa che la versione di Guava nella distinta base non ha alcuni metodi destinati alle funzioni lambda di Java 8, ad esempio ImmutableList.toImmutableList().

Se il tuo progetto richiede Java 8 o versioni successive e utilizza classi Guava come com.google.common.collect.Streams, devi aggiungere una dipendenza da una versione JRE di Guava.

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

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

L'esempio precedente non funziona se utilizzi enforcedPlatform perché enforcedPlatform ha la precedenza su constraints. Se vuoi utilizzare enforcedPlatform con la versione di Guava, puoi configurare ResolutionStrategy.