Trang này mô tả cách di chuyển từ Maven sang Bazel, bao gồm cả điều kiện tiên quyết và các bước cài đặt. Công cụ này mô tả sự khác biệt giữa Maven và Bazel, đồng thời cung cấp một ví dụ về di chuyển bằng cách sử dụng phương thức Dự án Guava.
Khi di chuyển từ bất kỳ công cụ xây dựng nào sang Bazel, tốt nhất bạn nên tạo cả hai chạy song song cho đến khi bạn đã di chuyển hoàn toàn nhóm phát triển của mình, hệ thống CI và bất kỳ hệ thống nào khác có liên quan. Bạn có thể chạy Maven và Bazel trong cùng một kho lưu trữ.
Trước khi bắt đầu
- Cài đặt Bazel nếu bạn chưa cài đặt Bazel này.
- Nếu bạn mới sử dụng Bazel, hãy xem hướng dẫn Giới thiệu về Bazel: Xây dựng Java trước khi bắt đầu di chuyển. Hướng dẫn giải thích khái niệm, cấu trúc và nhãn của Bazel của bạn.
Sự khác biệt giữa Maven và Bazel
- Maven sử dụng(các) tệp
pom.xml
cấp cao nhất. Bazel hỗ trợ nhiều bản dựng tệp và nhiều mục tiêu cho mỗi tệpBUILD
, cho phép các bản dựng có mức độ gia tăng cao hơn Maven. - Maven sẽ chịu trách nhiệm về các bước trong quy trình triển khai. Bazel có không tự động hoá việc triển khai.
- Bazel cho phép bạn biểu thị phần phụ thuộc giữa các ngôn ngữ.
- Khi thêm các phần mới vào dự án, có thể bạn sẽ phải thêm các phần mới với Bazel
BUILD
tệp. Phương pháp hay nhất là thêm tệpBUILD
vào mỗi gói Java mới.
Di chuyển từ Maven sang Bazel
Dưới đây là các bước mô tả cách di chuyển dự án của bạn sang Bazel:
Ví dụ dưới đây là về quá trình di chuyển
Dự án Guava từ Maven đến Bazel.
Dự án Guava được sử dụng là bản phát hành v31.1
. Các ví dụ sử dụng Guava không được hướng dẫn
từng bước trong quá trình di chuyển, nhưng
chúng sẽ cho thấy các tệp và nội dung
được tạo hoặc thêm theo cách thủ công để di chuyển.
$ git clone https://github.com/google/guava.git && cd guava
$ git checkout v31.1
1. Tạo tệp WORKSPACE
Tạo một tệp có tên WORKSPACE
ở gốc của dự án. Nếu dự án của bạn
không có phần phụ thuộc bên ngoài, nên tệp không gian làm việc có thể trống.
Nếu dự án của bạn phụ thuộc vào các tệp hoặc gói không nằm trong một
các thư mục của dự án, hãy chỉ định các phần phụ thuộc bên ngoài này trong không gian làm việc
. Cách tự động hoá việc liệt kê các phần phụ thuộc bên ngoài cho tệp không gian làm việc:
sử dụng rules_jvm_external
. Để biết hướng dẫn về cách sử dụng bộ quy tắc này, hãy xem
README.
Ví dụ về dự án Guava: phần phụ thuộc bên ngoài
Bạn có thể liệt kê các phần phụ thuộc bên ngoài của
Dự án Guava với
rules_jvm_external
bộ quy tắc.
Thêm đoạn mã sau vào tệp 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. Tạo một tệp BUILD
Giờ đây, bạn đã xác định không gian làm việc và các phần phụ thuộc bên ngoài (nếu
thích hợp) được liệt kê, bạn cần tạo BUILD
tệp để mô tả cách dự án của mình
cần được tạo. Không giống như Maven chỉ có một tệp pom.xml
, Bazel có thể sử dụng nhiều
BUILD
tệp để tạo dự án. Các tệp này chỉ định nhiều mục tiêu bản dựng,
cho phép Bazel tạo các bản dựng tăng dần.
Thêm tệp BUILD
theo các giai đoạn. Bắt đầu bằng cách thêm một tệp BUILD
ở thư mục gốc của dự án và sử dụng công cụ này để tạo bản dựng ban đầu bằng Bazel.
Sau đó, bạn sẽ tinh chỉnh bản dựng bằng cách thêm các tệp BUILD
khác có mức độ chi tiết cao hơn
mục tiêu.
Trong cùng thư mục với tệp
WORKSPACE
, hãy tạo một tệp văn bản và đặt tên tệp làBUILD
.Trong tệp
BUILD
này, hãy sử dụng quy tắc thích hợp để tạo một mục tiêu cho tạo dự án của bạn. Dưới đây là một số mẹo:Sử dụng quy tắc phù hợp:
Để tạo dự án bằng một mô-đun Maven duy nhất, hãy sử dụng Quy tắc
java_library
như sau:java_library( name = "everything", srcs = glob(["src/main/java/**/*.java"]), resources = glob(["src/main/resources/**"]), deps = ["//:all-external-targets"], )
Để tạo dự án có nhiều mô-đun Maven, hãy sử dụng Quy tắc
java_library
như sau: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"], )
Để tạo tệp nhị phân, hãy sử dụng quy tắc
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" )
Chỉ định các thuộc tính:
name
: Đặt một cái tên có ý nghĩa cho mục tiêu. Trong các ví dụ ở trên, mục tiêu được gọi là "mọi thứ".srcs
: Sử dụng hiệu ứng hình cầu để liệt kê tất cả tệp .java trong dự án của bạn.resources
: Sử dụng hiệu ứng toàn cầu để liệt kê tất cả tài nguyên trong dự án của bạn.deps
: Bạn cần xác định những phần phụ thuộc bên ngoài nào dự án của bạn. Ví dụ: nếu bạn đã tạo danh sách các phần phụ thuộc bằng công cụgenerate_workspace
, các phần phụ thuộc chojava_library
là các thư viện được liệt kê trong Macrogenerated_java_libraries
.
Hãy xem ví dụ bên dưới tệp BUILD cấp cao nhất này từ di chuyển dự án Guava.
Bây giờ, bạn đã có tệp
BUILD
ở gốc dự án, hãy tạo dự án của bạn để đảm bảo nó hoạt động. Trên dòng lệnh, từ Workspace, hãy sử dụngbazel build //:everything
để tạo với Bazel.Dự án hiện đã được xây dựng thành công bằng Bazel. Bạn sẽ cần để thêm các tệp
BUILD
khác nhằm cho phép các bản dựng tăng dần của dự án.
Ví dụ về dự án Guava: bắt đầu bằng một tệp BUILD
Khi di chuyển dự án Guava sang Bazel, ban đầu, một tệp BUILD
sẽ được sử dụng
để xây dựng toàn bộ dự án. Đây là nội dung của BUILD
ban đầu này
trong thư mục không gian làm việc:
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. Tạo thêm tệp BUILD (không bắt buộc)
Bazel chỉ hoạt động với một BUILD file
, như bạn thấy sau khi hoàn thành bước đầu tiên
bản dựng. Bạn vẫn nên cân nhắc chia bản dựng thành các phần nhỏ hơn bằng cách
thêm các tệp BUILD
khác có mục tiêu chi tiết.
Nếu bạn có nhiều tệp BUILD
với nhiều mục tiêu, bản dựng sẽ tăng lên
độ chi tiết, cho phép:
- gia tăng các bản dựng gia tăng của dự án,
- tăng cường thực thi song song bản dựng,
- giúp tăng khả năng bảo trì bản dựng cho người dùng trong tương lai, và
- kiểm soát chế độ hiển thị mục tiêu giữa các gói, điều này có thể ngăn chặn chẳng hạn như thư viện chứa thông tin triển khai chi tiết bị rò rỉ vào các API công khai.
Mẹo để thêm các tệp BUILD
khác:
- Bạn có thể bắt đầu bằng cách thêm một tệp
BUILD
vào mỗi gói Java. Bắt đầu bằng Các gói Java có ít phần phụ thuộc nhất và giúp bạn tăng tốc cho các gói có nhiều phần phụ thuộc nhất. - Khi bạn thêm tệp
BUILD
và chỉ định mục tiêu, hãy thêm các mục tiêu mới này vàodeps
phần của mục tiêu phụ thuộc vào các tuỳ chọn này. Xin lưu ý rằngglob()
không vượt qua ranh giới của gói, do đó số số gói tăng trưởng các tệp phù hợp vớiglob()
sẽ thu nhỏ. - Mỗi khi thêm một tệp
BUILD
vào thư mụcmain
, hãy nhớ thêm một tệpBUILD
sang thư mụctest
tương ứng. - Cẩn thận giới hạn mức độ hiển thị giữa các gói một cách hợp lý.
- Để đơn giản hoá việc khắc phục lỗi trong quá trình thiết lập tệp
BUILD
, hãy đảm bảo dự án tiếp tục xây dựng cùng với Bazel khi bạn thêm mỗi bản dựng . Hãy chạybazel build //...
để đảm bảo tất cả mục tiêu của bạn vẫn đang tạo.
4. Tạo ứng dụng bằng Bazel
Bạn đã xây dựng bằng Bazel khi thêm các tệp BUILD
để xác thực chế độ thiết lập
của bản dựng.
Khi có BUILD
tệp ở độ chi tiết mong muốn, bạn có thể sử dụng Bazel
để tạo tất cả các bản dựng của mình.