Halaman ini menjelaskan cara melakukan migrasi dari Maven ke Bazel, termasuk prasyarat dan langkah-langkah penginstalan. Artikel 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, pelajari tutorial Pengantar Bazel: Membangun Java sebelum Anda mulai melakukan migrasi. Tutorial ini menjelaskan konsep, struktur, dan sintaksis label Bazel.
Perbedaan antara Maven dan Bazel
- Maven menggunakan file
pom.xml
tingkat teratas. Bazel mendukung beberapa file build dan beberapa target per fileBUILD
, sehingga memungkinkan build yang lebih inkremental daripada Maven. - Maven akan menangani langkah-langkah untuk proses deployment. Bazel tidak mengotomatiskan deployment.
- Bazel memungkinkan Anda menyatakan dependensi antarbahasa.
- Saat menambahkan bagian baru ke project, dengan Bazel, Anda mungkin perlu menambahkan file
BUILD
baru. 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:
- Buat file WORKSPACE
- Buat satu file BUILD
- Membuat lebih banyak file BUILD
- Membangun menggunakan Bazel
Contoh di bawah berasal dari migrasi
project Guava dari Maven ke Bazel.
Project Guava yang digunakan adalah rilis v31.1
. Contoh yang menggunakan Guava tidak menjelaskan 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 WORKSPACE
Buat file bernama WORKSPACE
di root project Anda. Jika project Anda tidak memiliki dependensi eksternal, file ruang kerja dapat kosong.
Jika project Anda bergantung pada file atau paket yang tidak ada di salah satu direktori project, tentukan dependensi eksternal ini dalam file ruang kerja. Untuk mengotomatiskan pencantuman dependensi eksternal untuk file ruang kerja,
gunakan rules_jvm_external
. Untuk mengetahui petunjuk tentang cara menggunakan ruleset ini, lihat
README.
Contoh project Guava: dependensi eksternal
Anda dapat mencantumkan dependensi eksternal
project Guava dengan
set 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. 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 dibangun. Tidak seperti Maven dengan satu file pom.xml
, Bazel dapat menggunakan banyak file BUILD
untuk membangun project. File ini menentukan beberapa target build,
yang memungkinkan Bazel menghasilkan build inkremental.
Tambahkan file BUILD
secara bertahap. Mulai dengan menambahkan satu file BUILD
di root project Anda dan menggunakannya untuk melakukan build awal menggunakan Bazel.
Kemudian, Anda menyempurnakan build dengan menambahkan lebih banyak file BUILD
dengan target yang lebih terperinci.
Di direktori yang sama dengan file
WORKSPACE
, buat file teks dan beri namaBUILD
.Dalam file
BUILD
ini, gunakan aturan yang sesuai untuk membuat satu target guna membangun 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
: 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 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 file BUILD level teratas di bawah dari migrasi project Guava.
Setelah memiliki file
BUILD
di root project, bangun project untuk memastikan project berfungsi. Di command line, dari direktori ruang kerja, gunakanbazel build //:everything
untuk membangun project dengan Bazel.Project kini telah berhasil dibuat dengan Bazel. Anda harus menambahkan lebih banyak file
BUILD
untuk mengizinkan 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 project. Berikut isi file BUILD
awal ini di direktori ruang kerja:
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. Membuat lebih banyak file BUILD (opsional)
Bazel berfungsi dengan hanya satu BUILD file
, seperti yang Anda lihat setelah menyelesaikan build
pertama. Anda tetap harus mempertimbangkan untuk membagi build menjadi bagian-bagian yang lebih kecil dengan menambahkan lebih banyak file BUILD
dengan target terperinci.
Beberapa file BUILD
dengan beberapa target akan memberikan peningkatan
granularitas pada build, sehingga memungkinkan:
- meningkatkan build inkremental proyek,
- meningkatkan eksekusi paralel build,
- pemeliharaan build yang lebih baik untuk pengguna di masa mendatang, dan
- kontrol atas visibilitas target di antara paket, yang dapat mencegah masalah seperti detail implementasi yang terdapat dalam library bocor ke API publik.
Tips untuk menambahkan lebih banyak file BUILD
:
- Anda dapat memulai dengan menambahkan file
BUILD
ke setiap paket Java. Mulai dengan paket Java yang memiliki paling sedikit dependensi 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 berkurang. - Setiap kali Anda menambahkan file
BUILD
ke direktorimain
, pastikan Anda menambahkan fileBUILD
ke direktoritest
yang sesuai. - Berhati-hatilah untuk membatasi visibilitas dengan benar di antara paket.
- Untuk menyederhanakan pemecahan masalah error dalam penyiapan file
BUILD
, pastikan project terus dibangun dengan Bazel saat Anda menambahkan setiap file build. Jalankanbazel build //...
untuk memastikan semua target Anda masih dibangun.
4. Membangun menggunakan Bazel
Anda telah membangun menggunakan Bazel saat menambahkan file BUILD
untuk memvalidasi penyiapan build.
Setelah memiliki file BUILD
dengan perincian yang diinginkan, Anda dapat menggunakan Bazel untuk menghasilkan semua build.