Halaman ini menjelaskan cara bermigrasi dari Maven ke Bazel, termasuk prasyarat dan langkah-langkah penginstalannya. Hal ini menjelaskan perbedaan antara Maven dan Bazel, serta menyediakan contoh migrasi menggunakan dari project Guava.
Saat bermigrasi dari alat build apa pun ke Bazel, sebaiknya Anda memiliki alat yang berjalan secara paralel sampai Anda memigrasikan tim pengembangan Anda sepenuhnya, 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 mengenal Bazel, baca tutorial Pengantar Bazel: Bangun Java sebelum memulai bermigrasi. Tutorial ini menjelaskan konsep, struktur, dan label Bazel sintaksis.
Perbedaan antara Maven dan Bazel
- Maven menggunakan file
pom.xml
level atas. Bazel mendukung multi-build file dan beberapa target per fileBUILD
, memungkinkan build yang lebih inkremental daripada Maven. - Maven bertanggung jawab atas langkah-langkah proses deployment. Bazel melakukan tidak mengotomatiskan deployment.
- Bazel memungkinkan Anda untuk mengekspresikan dependensi antarbahasa.
- Saat Anda menambahkan bagian baru ke proyek, dengan Bazel, Anda mungkin perlu
BUILD
file. 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 Guava dari Maven ke Bazel.
Project Guava yang digunakan adalah rilis v31.1
. Contoh yang menggunakan Guava tidak memberikan panduan
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 WORKSPACE
Buat file bernama WORKSPACE
di root project Anda. Jika proyek Anda
tidak memiliki dependensi eksternal, file ruang kerja boleh kosong.
Jika project Anda bergantung pada file atau paket yang tidak ada di salah satu
dalam direktori project, tentukan dependensi eksternal ini di workspace
. Untuk mengotomatiskan listingan dependensi eksternal untuk file ruang kerja,
gunakan rules_jvm_external
. Untuk petunjuk tentang cara menggunakan kumpulan aturan ini, lihat
README.
Contoh project Guava: dependensi eksternal
Anda dapat membuat daftar dependensi eksternal dari
Project Guava dengan
rules_jvm_external
seperangkat aturan.
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 ruang kerja Anda ditentukan dan dependensi eksternal Anda (jika
berlaku), Anda perlu membuat file BUILD
untuk mendeskripsikan
harus dibangun. Tidak seperti Maven yang memiliki satu file pom.xml
-nya, Bazel dapat menggunakan banyak
BUILD
untuk membuat project. File ini menentukan
beberapa target build,
yang memungkinkan Bazel untuk
menghasilkan build inkremental.
Tambahkan BUILD
file secara bertahap. Mulai dengan menambahkan satu file BUILD
di akar proyek dan menggunakannya untuk
melakukan pembangunan awal menggunakan Bazel.
Kemudian, sempurnakan build Anda dengan menambahkan lebih banyak file BUILD
yang lebih terperinci
target.
Dalam direktori yang sama dengan file
WORKSPACE
Anda, buat file teks dan Beri namaBUILD
.Dalam file
BUILD
ini, gunakan aturan yang sesuai untuk membuat satu target untuk membangun 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. Misalnya, jika Anda membuat daftar dependensi 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 Anda memiliki file
BUILD
di root project, bangun proyek Anda untuk memastikan bahwa proyek itu berjalan. Pada baris perintah, dari direktori ruang kerja, gunakanbazel build //:everything
untuk membuat proyek bersama Bazel.Sekarang project telah berhasil dibuat dengan Bazel. Anda akan memerlukan untuk menambahkan lebih banyak file
BUILD
guna memungkinkan build inkremental project.
Contoh project Guava: mulai dengan satu file BUILD
Saat memigrasikan project Guava ke Bazel, pertama-tama satu file BUILD
digunakan
untuk membangun
seluruh proyek. Berikut adalah konten dari 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 dapat berfungsi dengan satu BUILD file
, seperti yang Anda lihat setelah menyelesaikan
buat. 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. Diawali dengan Paket Java yang memiliki dependensi paling sedikit dan cara kerja Anda ke 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 meningkatkan jumlah 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 bahwa proyek ini terus dibangun dengan Bazel saat Anda menambahkan setiap bangunan . 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.