Halaman ini menjelaskan cara bermigrasi dari Maven ke Bazel, termasuk prasyarat dan langkah-langkah penginstalannya. Contoh ini menjelaskan perbedaan antara Maven dan Bazel, serta memberikan contoh migrasi menggunakan project Guava.
Saat bermigrasi dari alat build apa pun ke Bazel, sebaiknya Anda memiliki kedua alat build berjalan secara paralel hingga Anda memigrasikan sepenuhnya tim pengembangan Anda, CI sistem, dan sistem lain yang relevan. Anda dapat menjalankan Maven dan Bazel secara repositori resource.
Sebelum memulai
- Instal Bazel jika belum diinstal.
- Jika Anda baru mengenal Bazel, buka tutorial Introduction to Bazel: Bangun Java sebelum mulai bermigrasi. Tutorial ini menjelaskan Konsep, struktur, dan sintaks 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 tambahan daripada Maven. - Maven menangani langkah-langkah untuk proses deployment. Bazel tidak mengotomatiskan deployment.
- Bazel memungkinkan Anda untuk mengekspresikan dependensi antarbahasa.
- Saat menambahkan bagian baru ke proyek, dengan Bazel, Anda mungkin perlu menambahkan
BUILD
file. Praktik terbaik adalah menambahkan fileBUILD
ke setiap Java baru paket.
Bermigrasi dari Maven ke Bazel
Langkah-langkah di bawah ini menjelaskan cara memigrasikan project Anda ke Bazel:
- Membuat file MODULE.bazel
- Buat satu file BUILD
- Buat file BUILD lainnya
- Membangun aplikasi menggunakan Bazel
Contoh di bawah berasal dari migrasi Guava
project dari Maven ke Bazel. Tujuan
Project Guava yang digunakan adalah rilis v31.1
. Contoh yang menggunakan Guava tidak berjalan
melalui setiap langkah dalam migrasi, tetapi mereka
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 proyek Anda
tidak memiliki dependensi eksternal, file ini boleh kosong.
Jika project Anda bergantung pada file atau paket yang tidak ada di salah satu
direktori proyek, tentukan dependensi
eksternal ini dalam direktori MODULE.bazel
. Anda dapat menggunakan rules_jvm_external
untuk mengelola dependensi dari Maven. Sebagai
petunjuk tentang cara menggunakan kumpulan aturan ini, lihat
README
kami.
Contoh project Guava: dependensi eksternal
Anda dapat membuat daftar dependensi eksternal Guava
project Anda dengan
rules_jvm_external
seperangkat 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. Buat satu file BUILD
Setelah ruang kerja Anda ditentukan dan dependensi eksternal Anda (jika
berlaku), Anda perlu membuat file BUILD
untuk menjelaskan
harus dibangun. Tidak seperti Maven dengan satu file pom.xml
-nya, Bazel dapat menggunakan
banyak file BUILD
untuk membuat project. File ini menentukan beberapa build
target, yang memungkinkan Bazel untuk menghasilkan build inkremental.
Tambahkan BUILD
file secara bertahap. Mulailah dengan menambahkan satu file BUILD
di root
proyek Anda dan menggunakannya untuk
melakukan pembangunan awal menggunakan Bazel. Kemudian, Anda menyempurnakan
build Anda dengan menambahkan lebih banyak file BUILD
dengan target yang lebih terperinci.
Dalam direktori yang sama dengan file
MODULE.bazel
Anda, buat file teks dan Beri namaBUILD
.Dalam file
BUILD
ini, gunakan aturan yang sesuai untuk membuat satu target guna membangun pada proyek Anda. Berikut ini beberapa tips:Gunakan aturan yang sesuai:
Untuk membangun project dengan satu modul Maven, gunakan
java_library
sebagai berikut:java_library( name = "everything", srcs = glob(["src/main/java/**/*.java"]), resources = glob(["src/main/resources/**"]), deps = ["//:all-external-targets"], )
Untuk membangun project dengan beberapa modul Maven, gunakan
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 membuat 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
: Berikan nama yang bermakna pada target. Dalam contoh di atas, targetnya disebut "semuanya."srcs
: Gunakan globbing untuk menampilkan daftar semua file .java di project Anda.resources
: Gunakan globbing untuk mencantumkan semua resource di project Anda.deps
: Anda perlu menentukan dependensi eksternal mana kebutuhan proyek Anda.
Lihat contoh di bawah ini dari BANGUN tingkat atas ini dari migrasi project Guava.
Sekarang setelah Anda memiliki file
BUILD
di root project, bangun proyek untuk memastikan semuanya berjalan. Pada command line, dari ruang kerja Anda Anda, gunakanbazel build //:everything
untuk membuat project dengan Bazel.Sekarang project telah berhasil dibuat 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, awalnya satu file BUILD
digunakan untuk
membangun seluruh proyek. 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. Buat lebih banyak file BUILD (opsional)
Bazel hanya dapat berfungsi dengan satu BUILD file
, seperti yang Anda lihat setelah menyelesaikan
build pertama. Anda masih harus mempertimbangkan untuk memecah
{i>build<i} menjadi potongan-potongan yang lebih kecil dengan
menambahkan lebih banyak file BUILD
dengan target terperinci.
Beberapa file BUILD
dengan beberapa target akan meningkatkan build
perincian, yang memungkinkan:
- peningkatan build inkremental dari proyek,
- peningkatan eksekusi paralel build,
- pemeliharaan yang lebih baik dari build untuk pengguna di masa depan, dan
- kontrol atas visibilitas target di antara paket, yang dapat mencegah 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. Memulai dengan Java paket yang memiliki dependensi paling sedikit dan sampai ke paket-paket yang paling banyak dependensinya. - Saat Anda menambahkan file
BUILD
dan menentukan target, tambahkan target baru ini kedeps
bagian target yang bergantung padanya. Perhatikan bahwaglob()
tidak melintasi batas paket, sehingga jumlah paket membuat file yang cocok denganglob()
akan menyusut. - Setiap kali menambahkan file
BUILD
ke direktorimain
, pastikan Anda menambahkan fileBUILD
ke direktoritest
yang sesuai. - Berhati-hatilah untuk membatasi visibilitas antar-paket dengan benar.
- Untuk menyederhanakan pemecahan masalah error dalam penyiapan file
BUILD
, pastikan proyek tersebut terus dibangun dengan Bazel saat Anda menambahkan setiap file {i>build<i}. Jalankanbazel build //...
untuk memastikan semua target Anda masih dibuat.
4. Membangun aplikasi menggunakan Bazel
Anda telah membangun menggunakan Bazel saat menambahkan file BUILD
untuk memvalidasi penyiapan
dari build.
Jika memiliki file BUILD
dengan tingkat perincian yang diinginkan, Anda dapat menggunakan Bazel untuk
memproduksi semua build Anda.