本頁面說明如何從 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:
下列範例是從 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
檔案。
在
MODULE.bazel
檔案所在的目錄中建立文字檔案,然後 將其命名為BUILD
。在這個
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
:您必須決定哪些外部依附元件 專案需求
請查看下方的頂層架構範例 檔案。
現在您已在專案的根目錄中加入
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 執行下列操作:
其中會產生所有版本