從 Maven 遷移至 Bazel

回報問題 查看原始碼 夜間 7.2 7.1 7.0 6.5 6.4

本頁面說明如何從 Maven 遷移至 Bazel,包括 前置作業和安裝步驟指出兩者 並在 Maven 和 Bazel 之間提供遷移範例,並提供使用 Guava 專案。

從任何建構工具遷移至 Bazel 時,建議您同時擁有 工具會同時運作,直到您完全遷移開發團隊為止。 持續整合系統和任何其他相關系統。您可以在 在同一個存放區中

事前準備

  • 如果尚未安裝 Bazel,請安裝
  • 如果您是第一次使用 Bazel,請完成本教學課程 Bazel 簡介:建構 Java 再開始 以及進行遷移本教學課程說明 Bazel 的概念、結構和標籤 語法。

Maven 和 Bazel 之間的差異

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

從 Maven 遷移至 Bazel

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

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

下方範例是從 從 Maven 到 Bazel 的 Guava 專案。 使用的 Guava 專案為 v31.1 版。使用 Guava 的範例無法完整說明 每個步驟仍會顯示 手動產生或新增的遷移作業

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

1. 建立 WORKSPACE 檔案

在專案的根目錄中建立名為 WORKSPACE 的檔案。如果您的專案 沒有外部依附元件,工作區檔案可以空白。

如果您的專案依附於 專案的目錄,請在工作區指定這些外部依附元件 檔案。如要自動列出工作區檔案的外部依附元件, 使用 rules_jvm_external。如需此規則集的操作說明,請參閱

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

您可以在 GCP 中列出 Guava 專案 rules_jvm_external敬上 規則集。

WORKSPACE 檔案中新增下列程式碼片段:

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

RULES_JVM_EXTERNAL_TAG = "4.3"
RULES_JVM_EXTERNAL_SHA = "6274687f6fc5783b589f56a2f1ed60de3ce1f99bc4e8f9edef3de43bdf7c6e74"

http_archive(
    name = "rules_jvm_external",
    sha256 = RULES_JVM_EXTERNAL_SHA,
    strip_prefix = "rules_jvm_external-%s" % RULES_JVM_EXTERNAL_TAG,
    url = "https://github.com/bazelbuild/rules_jvm_external/archive/%s.zip" % RULES_JVM_EXTERNAL_TAG,
)

load("@rules_jvm_external//:defs.bzl", "maven_install")

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",
    ],
)

2. 建立一個 BUILD 檔案

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

請分階段新增 BUILD 個檔案。開始新增一個BUILD檔案 並在專案根目錄中透過 Bazel 利用它執行初始建構作業。 接著,您可以更精細地新增更多 BUILD 檔案,藉此修正建構作業 目標。

  1. WORKSPACE 檔案所在的目錄中建立文字檔案,然後 將其命名為 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:您必須決定哪些外部依附元件 專案需求舉例來說,假如您在 Cloud Build 中 使用 generate_workspace 工具的依附元件、依附元件 java_library 的程式庫列出了 generated_java_libraries 巨集。
    • 查看 請參考這個頂層 BUILD 檔案的範例 Guava 專案的遷移過程

  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",
    ]),
    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 產生所有版本