如要確保專案使用相容版本的 Cloud 用戶端程式庫,請使用 Google Cloud程式庫物料清單 (BOM) 中指定的版本。BOM 中的程式庫不會發生依附元件衝突,因此不會顯示為 NoSuchMethodError 或 NoClassDefFoundError。
Google 發布了超過兩百個開放原始碼 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。新增 platform 依附元件,並從構件 build.gradle 檔案的依附元件宣告中移除版本。com.google.cloud:libraries-bom
platform 和 enforcedPlatform 關鍵字會提供 BOM 中宣告的依附元件版本。enforcedPlatform 關鍵字會強制執行 BOM 中宣告的依附元件版本,因此會覆寫您指定的版本。如要進一步瞭解 Gradle 5.x 以上版本的 platform 和 enforcedPlatform 關鍵字,請參閱「Gradle:匯入 Maven BOM」。
如果使用 Gradle 4.6 以上版本,請將 enableFeaturePreview('IMPROVED_POM_SUPPORT') 新增至 settings.gradle 檔案。詳情請參閱「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 版本包含兩種構件:「-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 包含 Guava,並使用「-android」版本,確保 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。如要搭配 Guava 版本使用 enforcedPlatform,可以設定 ResolutionStrategy。