本頁面說明如何從 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:
下方範例是從
從 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
檔案,藉此修正建構作業
目標。
在
WORKSPACE
檔案所在的目錄中建立文字檔案,然後 將其命名為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
:您必須決定哪些外部依附元件 專案需求舉例來說,假如您在 Cloud Build 中 使用generate_workspace
工具的依附元件、依附元件java_library
的程式庫列出了generated_java_libraries
巨集。
查看 請參考這個頂層 BUILD 檔案的範例 Guava 專案的遷移過程
現在您已將
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
產生所有版本