Halaman ini menjelaskan cara bermigrasi dari Maven ke Bazel, termasuk prasyarat dan langkah-langkah penginstalan. Halaman ini menjelaskan perbedaan antara Maven dan Bazel, serta memberikan contoh migrasi menggunakan project Guava.
Saat bermigrasi dari alat build apa pun ke Bazel, sebaiknya jalankan kedua alat build secara paralel hingga Anda sepenuhnya memigrasikan tim pengembangan, sistem CI, dan sistem relevan lainnya. Anda dapat menjalankan Maven dan Bazel di repositori yang sama.
Sebelum memulai
- Instal Bazel jika belum diinstal.
- Jika Anda baru menggunakan Bazel, baca tutorial Pengantar Bazel: Mem-build Java sebelum mulai bermigrasi. Tutorial ini menjelaskan konsep, struktur, dan sintaksis label Bazel.
Perbedaan antara Maven dan Bazel
- Maven menggunakan file
pom.xmllevel teratas. Bazel mendukung beberapa file build dan beberapa target per fileBUILD, sehingga memungkinkan build yang lebih inkremental daripada Maven. - Maven bertanggung jawab atas langkah-langkah untuk proses deployment. Bazel tidak mengotomatiskan deployment.
- Bazel memungkinkan Anda menyatakan dependensi antar-bahasa.
- Saat Anda menambahkan bagian baru ke project, dengan Bazel, Anda mungkin perlu menambahkan file
BUILDbaru. Praktik terbaiknya adalah menambahkan fileBUILDke setiap paket Java baru.
Bermigrasi dari Maven ke Bazel
Langkah-langkah di bawah menjelaskan cara memigrasikan project Anda ke Bazel:
- Membuat file MODULE.bazel
- Membuat satu file BUILD
- Membuat lebih banyak file BUILD
- Mem-build menggunakan Bazel
Contoh di bawah berasal dari migrasi project Guava
project dari Maven ke Bazel. Project Guava yang digunakan adalah rilis v31.1. Contoh yang menggunakan Guava tidak membahas setiap langkah dalam migrasi, tetapi menunjukkan file dan konten yang dibuat atau ditambahkan secara manual untuk migrasi.
$ git clone https://github.com/google/guava.git && cd guava
$ git checkout v31.1
1. Membuat file MODULE.bazel
Buat file bernama MODULE.bazel di root project Anda. Jika project Anda tidak memiliki dependensi eksternal, file ini dapat kosong.
Jika project Anda bergantung pada file atau paket yang tidak berada di salah satu direktori project, tentukan dependensi eksternal ini dalam file MODULE.bazel. Anda dapat menggunakan rules_jvm_external untuk mengelola dependensi dari Maven. Untuk mengetahui petunjuk tentang cara menggunakan kumpulan aturan ini, lihat the
README
.
Contoh project Guava: dependensi eksternal
Anda dapat mencantumkan dependensi eksternal project Guava dengan
rules_jvm_external
kumpulan aturan.
Tambahkan cuplikan berikut ke file 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. Membuat satu file BUILD
Setelah menentukan ruang kerja dan mencantumkan dependensi eksternal (jika berlaku), Anda perlu membuat file BUILD untuk menjelaskan cara project Anda harus di-build. Tidak seperti Maven dengan satu file pom.xml, Bazel dapat menggunakan banyak file BUILD untuk mem-build project. File ini menentukan beberapa target build, yang memungkinkan Bazel menghasilkan build inkremental.
Tambahkan file BUILD secara bertahap. Mulailah dengan menambahkan satu file BUILD di root project Anda dan menggunakannya untuk melakukan build awal menggunakan Bazel. Kemudian, Anda dapat meningkatkan kualitas build dengan menambahkan lebih banyak file BUILD dengan target yang lebih mendetail.
Di direktori yang sama dengan file
MODULE.bazel, buat file teks dan beri namaBUILD.Dalam file
BUILDini, gunakan aturan yang sesuai untuk membuat satu target untuk mem-build project Anda. Berikut ini beberapa tips:Gunakan aturan yang sesuai:
Untuk mem-build project dengan satu modul Maven, gunakan aturan
java_librarysebagai berikut:java_library( name = "everything", srcs = glob(["src/main/java/**/*.java"]), resources = glob(["src/main/resources/**"]), deps = ["//:all-external-targets"], )Untuk mem-build project dengan beberapa modul Maven, gunakan aturan
java_librarysebagai berikut: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"], )Untuk mem-build biner, gunakan aturan
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" )Tentukan atribut:
name: Beri target nama yang bermakna. Dalam contoh di atas, targetnya disebut "everything".srcs: Gunakan globbing untuk mencantumkan semua file .java di project Anda.resources: Gunakan globbing untuk mencantumkan semua resource di project Anda.deps: Anda harus menentukan dependensi eksternal yang diperlukan project Anda.
Lihat contoh file BUILD level teratas ini dari migrasi project Guava di bawah.
Setelah memiliki file
BUILDdi root project, build project Anda untuk memastikan project berfungsi. Di command line, dari direktori ruang kerja Anda, gunakanbazel build //:everythinguntuk mem-build project Anda dengan Bazel.Project kini telah berhasil di-build dengan Bazel. Anda harus menambahkan lebih banyak file
BUILDuntuk memungkinkan build inkremental project.
Contoh project Guava: mulai dengan satu file BUILD
Saat memigrasikan project Guava ke Bazel, awalnya satu file BUILD digunakan untuk mem-build seluruh project. Berikut konten file BUILD awal ini di direktori ruang kerja:
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. Membuat lebih banyak file BUILD (opsional)
Bazel berfungsi dengan hanya satu BUILD file, seperti yang Anda lihat setelah menyelesaikan build pertama. Namun, Anda tetap harus mempertimbangkan untuk membagi build menjadi bagian yang lebih kecil dengan menambahkan lebih banyak file BUILD dengan target yang mendetail.
Beberapa file BUILD dengan beberapa target akan memberikan peningkatan detail pada build, sehingga memungkinkan:
- peningkatan build inkremental project,
- peningkatan eksekusi paralel build,
- kemudahan pemeliharaan build yang lebih baik untuk pengguna di masa mendatang, dan
- kontrol atas visibilitas target antar-paket, yang dapat mencegah masalah seperti library yang berisi detail implementasi yang bocor ke API publik.
Tips untuk menambahkan lebih banyak file BUILD:
- Anda dapat mulai dengan menambahkan file
BUILDke setiap paket Java. Mulailah dengan paket Java yang memiliki dependensi paling sedikit dan lanjutkan ke paket dengan dependensi terbanyak. - Saat Anda menambahkan file
BUILDdan menentukan target, tambahkan target baru ini ke bagiandepstarget yang bergantung padanya. Perhatikan bahwa fungsiglob()tidak melintasi batas paket, sehingga seiring bertambahnya jumlah paket, file yang cocok denganglob()akan berkurang. - Setiap kali Anda menambahkan file
BUILDke direktorimain, pastikan Anda menambahkan fileBUILDke direktoritestyang sesuai. - Berhati-hatilah untuk membatasi visibilitas dengan benar antar-paket.
- Untuk menyederhanakan pemecahan masalah error dalam penyiapan file
BUILD, pastikan project terus di-build dengan Bazel saat Anda menambahkan setiap file build. Jalankanbazel build //...untuk memastikan semua target Anda masih di-build.
4. Mem-build menggunakan Bazel
Anda telah mem-build menggunakan Bazel saat menambahkan file BUILD untuk memvalidasi penyiapan build.
Jika memiliki file BUILD dengan detail yang diinginkan, Anda dapat menggunakan Bazel untuk menghasilkan semua build.