Halaman ini menjelaskan cara bermigrasi dari Maven ke Bazel, termasuk prasyarat dan langkah penginstalan. Dokumen ini menjelaskan perbedaan antara Maven dan Bazel, serta memberikan contoh migrasi menggunakan project Guava.
Saat bermigrasi dari alat build apa pun ke Bazel, sebaiknya kedua alat build berjalan 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, buka tutorial Introduction to Bazel: Build Java sebelum memulai migrasi. Tutorial ini menjelaskan konsep, struktur, dan sintaksis label Bazel.
Perbedaan antara Maven dan Bazel
- Maven menggunakan file
pom.xml
level 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 menambahkan bagian baru ke project, Anda mungkin perlu menambahkan file
BUILD
baru dengan Bazel. Praktik terbaiknya adalah menambahkan fileBUILD
ke setiap paket Java baru.
Bermigrasi dari Maven ke Bazel
Langkah-langkah di bawah ini menjelaskan cara memigrasikan project Anda ke Bazel:
- Membuat file MODULE.bazel
- Membuat satu file BUILD
- Buat file BUILD lainnya
- Mem-build menggunakan Bazel
Contoh di bawah ini berasal dari migrasi project
Guava dari Maven ke Bazel. Project
Guava yang digunakan adalah rilis v31.1
. Contoh yang menggunakan Guava tidak akan memandu
setiap langkah dalam migrasi, tetapi menampilkan 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 ada 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 README
.
Contoh project Guava: dependensi eksternal
Anda dapat mencantumkan dependensi eksternal project
Guava dengan
kumpulan aturan
rules_jvm_external
.
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
mem-build project. Tidak seperti Maven yang memiliki satu file pom.xml
-nya, Bazel dapat menggunakan
banyak file BUILD
untuk membuat 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 meningkatkan kualitas
build dengan menambahkan lebih banyak file BUILD
dengan target yang lebih terperinci.
Di direktori yang sama dengan file
MODULE.bazel
, buat file teks dan beri namaBUILD
.Dalam file
BUILD
ini, gunakan aturan yang sesuai untuk membuat satu target guna mem-build project Anda. Berikut ini beberapa tips:Gunakan aturan yang sesuai:
Untuk mem-build project dengan satu modul Maven, gunakan aturan
java_library
sebagai 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_library
sebagai 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, target disebut "everything".srcs
: Gunakan globbing untuk mencantumkan semua file .java dalam project Anda.resources
: Gunakan globbing untuk mencantumkan semua resource dalam project Anda.deps
: Anda perlu menentukan dependensi eksternal yang diperlukan project Anda.
Lihat contoh di bawah untuk file BUILD level teratas ini dari migrasi project Guava.
Sekarang, setelah Anda memiliki file
BUILD
di root project, bangun project Anda untuk memastikan bahwa project tersebut berfungsi. Di command line, dari direktori workspace, gunakanbazel build //:everything
untuk mem-build project dengan Bazel.Project kini telah berhasil di-build dengan Bazel. Anda perlu menambahkan lebih banyak file
BUILD
untuk memungkinkan build inkremental project.
Contoh project Guava: mulai dengan satu file BUILD
Saat memigrasikan project Guava ke Bazel, satu file BUILD
akan digunakan untuk
mem-build seluruh project terlebih dahulu. Berikut adalah isi 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 hanya berfungsi dengan satu BUILD file
, seperti yang Anda lihat setelah menyelesaikan
build pertama. Sebaiknya tetap pertimbangkan untuk memecah build menjadi potongan-potongan yang lebih kecil dengan
menambahkan lebih banyak file BUILD
dengan target yang terperinci.
Beberapa file BUILD
dengan beberapa target akan memberikan granularitas
yang lebih besar pada build, sehingga memungkinkan:
- peningkatan build inkremental project,
- meningkatkan eksekusi paralel build,
- kemampuan pemeliharaan build yang lebih baik bagi pengguna di masa mendatang, dan
- kontrol atas visibilitas target di antara 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 memulai dengan menambahkan file
BUILD
ke setiap paket Java. Mulailah dengan paket Java yang memiliki dependensi paling sedikit dan lanjutkan ke paket dengan dependensi terbanyak. - Saat Anda menambahkan file
BUILD
dan menentukan target, tambahkan target baru ini ke bagiandeps
target yang bergantung padanya. Perhatikan bahwa fungsiglob()
tidak melintasi batas paket, sehingga seiring bertambahnya jumlah paket, file yang cocok denganglob()
akan menyusut. - Setiap kali Anda menambahkan file
BUILD
ke direktorimain
, pastikan Anda menambahkan fileBUILD
ke direktoritest
yang sesuai. - Pastikan 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 tingkat perincian yang diinginkan, Anda dapat menggunakan Bazel untuk
membuat semua build.