從 Maven 遷移至 Bazel

回報問題 查看來源 。 。 。 。 夜間。 。 7.3 。 。 7.2 。 。 7.1 。 。 7.0 。 。 6.5

本頁面說明如何從 Maven 遷移至 Bazel,包括 前置作業和安裝步驟其中說明 Maven 和 和 Bazel,並提供使用 Guava 專案的遷移範例。

從任何建構工具遷移至 Bazel 時,建議您同時使用兩種建構工具 同時執行,直到您完全遷移開發團隊 CI 為止 和其他任何相關系統您可以在 Cloud Storage 也提供目錄同步處理功能

事前準備

  • 如果尚未安裝 Bazel,請安裝
  • 如果您是第一次使用 Bazel,請參閱 Bazel 簡介: 開始遷移之前建構 Java。本教學課程會說明 Bazel 的概念、結構和標籤語法。

Maven 和 Bazel 之間的差異

  • Maven 使用頂層 pom.xml 檔案。Bazel 支援多個建構檔案 和每個 BUILD 檔案有多個目標,因此可以針對版本較多的建構作業 比 Maven 的成本還要高
  • Maven 會負責部署部署程序的步驟。Bazel 不會 自動執行部署作業
  • Bazel 可讓您表示語言之間的依附元件。
  • 在專案中加入新區段時,您可能需要透過 Bazel 新增 BUILD 個檔案。最佳做法是為每個新的 Java 新增 BUILD 檔案 套件。

從 Maven 遷移至 Bazel

下列步驟說明如何將專案遷移至 Bazel:

  1. 建立 MODULE.bazel 檔案
  2. 建立一個 BUILD 檔案
  3. 建立更多 BUILD 檔案
  4. 使用 Bazel 建構

下列範例是從 Guava 遷移而來的 專案從 Maven 到 Bazel 使用的 Guava 專案為 v31.1 版。使用 Guava 的範例 (非步行) 每個步驟都會包含每個步驟,但操作說明會列出 才能手動產生或新增遷移作業

$ git clone https://github.com/google/guava.git && cd guava
$ git checkout v31.1

1. 建立 MODULE.bazel 檔案

在專案的根目錄中建立名為 MODULE.bazel 的檔案。如果您的專案 沒有外部依附元件,這個檔案可以空白。

如果您的專案依附於 專案的目錄,請在 MODULE.bazel 中指定這些外部依附元件 檔案。您可以使用 rules_jvm_external 從 Maven 管理依附元件。適用對象 請參閱這個規則集的使用說明,請參閱 README ,直接在 Google Cloud 控制台實際操作。

Guava 專案範例:外部依附元件

您可以列出 Guava 的外部依附元件 專案 rules_jvm_external敬上 規則集。

MODULE.bazel 檔案中新增下列程式碼片段:

bazel_dep(name = "rules_jvm_external", version = "6.2")
maven = use_extension("@rules_jvm_external//:extensions.bzl", "maven")
maven.install(
    artifacts = [
        "com.google.code.findbugs:jsr305:3.0.2",
        "com.google.errorprone:error_prone_annotations:2.11.0",
        "com.google.j2objc:j2objc-annotations:1.3",
        "org.codehaus.mojo:animal-sniffer-annotations:1.20",
        "org.checkerframework:checker-qual:3.12.0",
    ],
    repositories = [
        "https://repo1.maven.org/maven2",
    ],
)
use_repo(maven, "maven")

2. 建立一個 BUILD 檔案

既然您已經定義工作區並定義了外部依附元件 ( 適用的情況),您需要建立 BUILD 檔案來說明 以及專案與 Maven 只有一個 pom.xml 檔案不同,Bazel 可以使用 建構專案所需的許多 BUILD 檔案。這些檔案指定多個版本 ,讓 Bazel 能產生漸進式建構作業

請分階段新增 BUILD 個檔案。請先在根目錄新增一個 BUILD 檔案 然後使用 Bazel 進行初始建構作業。然後修正 ,透過更精細的目標新增更多 BUILD 檔案。

  1. MODULE.bazel 檔案所在的目錄中建立文字檔案,然後 將其命名為 BUILD

  2. 在這個 BUILD 檔案中,使用適當的規則來建立要建構的目標 。以下提供幾項訣竅:

    • 使用合適的規則:

      • 如要以單一 Maven 模組建構專案,請使用 java_library 規則,如下所示:

        java_library(
           name = "everything",
           srcs = glob(["src/main/java/**/*.java"]),
           resources = glob(["src/main/resources/**"]),
           deps = ["//:all-external-targets"],
        )
        
      • 如要建構含有多個 Maven 模組的專案,請使用 java_library 規則,如下所示:

        java_library(
           name = "everything",
           srcs = glob([
                 "Module1/src/main/java/**/*.java",
                 "Module2/src/main/java/**/*.java",
                 ...
           ]),
           resources = glob([
                 "Module1/src/main/resources/**",
                 "Module2/src/main/resources/**",
                 ...
           ]),
           deps = ["//:all-external-targets"],
        )
        
      • 如要建構二進位檔,請使用 java_binary 規則:

        java_binary(
           name = "everything",
           srcs = glob(["src/main/java/**/*.java"]),
           resources = glob(["src/main/resources/**"]),
           deps = ["//:all-external-targets"],
           main_class = "com.example.Main"
        )
        
      • 指定屬性:

        • name:為目標取一個有意義的名稱。範例 以上就是「一切」
        • srcs:使用 globbing 列出專案中的所有 .java 檔案。
        • resources:使用 globbing 列出專案中的所有資源。
        • deps:您必須決定哪些外部依附元件 專案需求
      • 請查看下方的頂層架構範例 檔案

  3. 現在您已在專案的根目錄中加入 BUILD 檔案,請建構 確保專案正常運作從工作區使用指令列 目錄,使用 bazel build //:everything 透過 Bazel 建構專案。

    此時此專案已成功使用 Bazel 建構。您需要新增 增加 BUILD 檔案,允許專案的漸進式版本。

Guava 專案範例:從一個 BUILD 檔案開始

將 Guava 專案遷移至 Bazel 時,一開始會有一個 BUILD 檔案用於 建構完整的專案以下是這個 BUILD 初始檔案的內容: 工作區目錄:

java_library(
    name = "everything",
    srcs = glob([
        "guava/src/**/*.java",
        "futures/failureaccess/src/**/*.java",
    ]),
    javacopts = ["-XepDisableAllChecks"],
    deps = [
        "@maven//:com_google_code_findbugs_jsr305",
        "@maven//:com_google_errorprone_error_prone_annotations",
        "@maven//:com_google_j2objc_j2objc_annotations",
        "@maven//:org_checkerframework_checker_qual",
        "@maven//:org_codehaus_mojo_animal_sniffer_annotations",
    ],
)

3. 建立更多 BUILD 檔案 (選用)

Bazel 只需處理一個 BUILD file,就像在完成 第一個版本您仍應考慮將版本分割為多個更小的區塊,方法是 新增更多含有精細目標的 BUILD 檔案。

具有多個目標的多個 BUILD 檔案會增加版本 細分,可讓您:

  • 增加專案的漸進式版本
  • 增加版本的平行執行作業
  • 讓日後使用者享有更好的版本維護性
  • 控管套件的目標瀏覽權限 例如程式庫包含詳細的實作詳細資料 公開 API

新增更多 BUILD 檔案的訣竅:

  • 首先,為每個 Java 套件新增 BUILD 檔案。從 Java 開始 具備最少依附元件的套件,並逐步增加倒數 最依附元件
  • 加入 BUILD 檔案並指定指定目標時,請將這些新的目標加進 有 deps 個取決於目標的區段。請注意,glob() 函式不會跨套件邊界,因此如套件數量 會增加 glob() 比對相符的檔案。
  • 每次將 BUILD 檔案新增至 main 目錄時,請務必新增 BUILD 檔案移至對應的 test 目錄。
  • 請小心限制套件之間的瀏覽權限。
  • 如要簡化 BUILD 檔案中設定錯誤的疑難排解流程,請確認 會在您新增每個建構檔案時,持續使用 Bazel 進行建構。 執行 bazel build //...,確保所有目標仍然建構。

4. 使用 Bazel 進行建構

您已透過 Bazel 新增 BUILD 檔案來驗證設定 建構過程

取得 BUILD 檔案所需的精細程度時,您可以使用 Bazel 執行下列操作: 其中會產生所有版本