Halaman ini menjelaskan cara bermigrasi dari Maven ke Bazel, termasuk prasyarat dan langkah penginstalan. Panduan 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 sampai Anda memigrasikan sepenuhnya tim pengembangan, sistem CI, dan sistem lain yang relevan. 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: 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 atas. Bazel mendukung beberapa file build dan beberapa target per fileBUILD
, sehingga memungkinkan build yang lebih inkremental daripada Maven. - Maven bertanggung jawab atas langkah-langkah proses deployment. Bazel tidak mengotomatiskan deployment.
- Bazel memungkinkan Anda untuk mengekspresikan dependensi antarbahasa.
- Saat menambahkan bagian baru ke project, Anda mungkin perlu menambahkan file
BUILD
baru dengan Bazel. Praktik terbaik 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 WORKSPACE
- Buat satu file BUILD
- Buat file BUILD lainnya
- Membangun aplikasi menggunakan Bazel
Contoh di bawah ini berasal dari migrasi
project Guaava dari Maven ke Bazel.
Project Guava yang digunakan adalah rilis v31.1
. Contoh yang menggunakan Guava tidak 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 WORKSPACE
Buat file bernama WORKSPACE
di root project Anda. Jika project Anda
tidak memiliki dependensi eksternal, file ruang kerja boleh kosong.
Jika project Anda bergantung pada file atau paket yang tidak ada di salah satu
direktori project, tentukan dependensi eksternal ini di file
workspace. Untuk mengotomatiskan listingan dependensi eksternal untuk file ruang kerja,
gunakan rules_jvm_external
. Untuk mengetahui petunjuk tentang penggunaan 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 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. Buat satu file BUILD
Setelah menentukan ruang kerja dan dependensi eksternal (jika
berlaku), Anda perlu membuat file BUILD
untuk menjelaskan cara membangun
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 BUILD
file secara bertahap. Mulailah dengan menambahkan satu file BUILD
di root project Anda dan menggunakannya untuk melakukan build awal menggunakan Bazel.
Kemudian, Anda dapat menyempurnakan build dengan menambahkan lebih banyak file BUILD
dengan target
yang lebih terperinci.
Di direktori yang sama dengan file
WORKSPACE
Anda, buat file teks dan berikan 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 membuat 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 membuat 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 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, target 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 yang diperlukan project Anda. Misalnya, jika Anda membuat daftar dependensi eksternal menggunakan alatgenerate_workspace
, dependensi untukjava_library
adalah library yang tercantum dalam makrogenerated_java_libraries
.
Lihat contoh di bawah file BUILD tingkat atas ini dari migrasi project Guava.
Sekarang, setelah memiliki file
BUILD
di root project, bangun project Anda untuk memastikan bahwa file tersebut berfungsi. Pada command line, dari direktori ruang kerja, gunakanbazel build //:everything
untuk membangun project Anda 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, satu file BUILD
akan digunakan terlebih dahulu untuk membuat seluruh project. Berikut adalah konten file BUILD
awal ini di direktori Workspace:
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. Buat 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 perincian yang lebih besar pada build, sehingga:
- 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 antar-paket, yang dapat mencegah masalah seperti library yang berisi detail implementasi 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 dengan paket yang memiliki dependensi paling banyak. - Saat Anda menambahkan file
BUILD
dan menentukan target, tambahkan target baru ini ke bagiandeps
target yang bergantung padanya. Perlu diperhatikan bahwa fungsiglob()
tidak melewati batas paket sehingga jumlah paket bertambah, 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 project terus dibuat dengan Bazel saat Anda menambahkan setiap file build. 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 build.
Jika memiliki file BUILD
dengan tingkat perincian yang diinginkan, Anda dapat menggunakan Bazel
untuk memproduksi semua build.