Bermigrasi dari Maven ke Bazel

Tetap teratur dengan koleksi Simpan dan kategorikan konten berdasarkan preferensi Anda.
Laporkan masalah Lihat sumber

Halaman ini menjelaskan cara melakukan migrasi dari Maven ke Bazel, termasuk prasyarat dan langkah penginstalan. Halaman ini menjelaskan perbedaan antara Maven dan Bazel, serta memberikan contoh migrasi menggunakan project Guaava.

Saat bermigrasi dari alat build ke Bazel, sebaiknya jalankan kedua alat build secara paralel sampai Anda memigrasikan tim pengembangan, sistem CI, dan sistem relevan lainnya secara penuh. 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: Membuat Java sebelum mulai melakukan 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 file BUILD, sehingga memungkinkan build yang lebih inkremental daripada milik Maven.
  • Maven bertanggung jawab atas langkah-langkah untuk proses deployment. Bazel tidak mengotomatiskan deployment.
  • Bazel memungkinkan Anda mengekspresikan dependensi antarbahasa.
  • Saat Anda menambahkan bagian baru ke project, dengan Bazel, Anda mungkin perlu menambahkan file BUILD baru. Praktik terbaiknya adalah menambahkan file BUILD ke setiap paket Java baru.

Bermigrasi dari Maven ke Bazel

Langkah-langkah di bawah menjelaskan cara memigrasikan project Anda ke Bazel:

  1. Membuat file WORKSPACE
  2. Membuat satu file BUILD
  3. Membuat BUILD file lainnya
  4. Mem-build aplikasi 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 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 dapat kosong.

Jika project Anda bergantung pada file atau paket yang tidak ada di salah satu direktori project, tentukan dependensi eksternal ini di file ruang kerja. Untuk mengotomatiskan listingan dependensi eksternal untuk file Workspace, gunakan rules_jvm_external. 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 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 Anda menentukan ruang kerja dan dependensi eksternal (jika berlaku), Anda perlu membuat file BUILD untuk menjelaskan cara membuat project. Tidak seperti Maven dengan satu file pom.xml, Bazel dapat menggunakan banyak file BUILD untuk mem-build 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 gunakan untuk melakukan build awal menggunakan Bazel. Kemudian, Anda menyempurnakan build dengan menambahkan lebih banyak file BUILD dengan target yang lebih terperinci.

  1. Dalam direktori yang sama dengan file WORKSPACE Anda, buat file teks dan beri nama BUILD.

  2. Dalam file BUILD ini, gunakan aturan yang sesuai untuk membuat satu target guna membuat project Anda. Berikut adalah 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 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 nama yang bermakna untuk target. Dalam contoh di atas, target disebut "semua".
      • srcs: Menggunakan globbing untuk mencantumkan semua file .java dalam project Anda.
      • resources: Menggunakan globbing untuk mencantumkan semua resource dalam project Anda.
      • deps: Anda perlu menentukan dependensi eksternal yang diperlukan project Anda. Misalnya, jika Anda membuat daftar dependensi eksternal menggunakan alat generate_workspace, dependensi untuk java_library adalah library yang tercantum dalam makro generated_java_libraries.
    • Lihat contoh di bawah ini atas file BUILD tingkat ini dari migrasi project Guava.

  3. Setelah memiliki file BUILD di root project, build project untuk memastikannya berfungsi. Dari command line, dari direktori ruang kerja Anda, gunakan bazel build //:everything untuk mem-build project dengan Bazel.

    Project kini berhasil dibuat dengan Bazel. Anda perlu 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 membuat seluruh project. Berikut adalah isi file BUILD awal ini dalam 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. Buat lebih banyak BUILD file (opsional)

Bazel berfungsi hanya dengan satu BUILD file, seperti yang Anda lihat setelah menyelesaikan build pertama. Anda tetap harus mempertimbangkan untuk membagi build menjadi bagian yang lebih kecil dengan menambahkan lebih banyak file BUILD dengan target terperinci.

Beberapa file BUILD dengan beberapa target akan memberikan perincian yang ditingkatkan, sehingga memungkinkan:

  • peningkatan build inkremental project,
  • peningkatan eksekusi paralel build,
  • pemeliharaan build yang lebih baik untuk pengguna di masa mendatang, dan
  • kontrol atas visibilitas target antar-paket, yang dapat mencegah masalah seperti library yang berisi detail implementasi bocor ke API publik.

Tips untuk menambahkan file BUILD lainnya

  • Anda dapat memulai dengan menambahkan file BUILD ke setiap paket Java. Mulailah dengan paket Java yang memiliki dependensi paling sedikit dan berlanjut ke paket yang memiliki dependensi paling banyak.
  • Saat Anda menambahkan file BUILD dan menentukan target, tambahkan target baru ini ke bagian deps target yang bergantung padanya. Perlu diperhatikan bahwa fungsi glob() tidak melampaui batas paket. Oleh karena itu, seiring jumlah paket bertambah, file yang cocok dengan glob() akan menyusut.
  • Setiap kali menambahkan file BUILD ke direktori main, pastikan Anda menambahkan file BUILD ke direktori test yang sesuai.
  • Berhati-hatilah untuk membatasi visibilitas dengan benar di antara paket.
  • Untuk menyederhanakan error pemecahan masalah dalam penyiapan file BUILD, pastikan project terus di-build dengan Bazel saat Anda menambahkan setiap file build. Jalankan bazel build //... untuk memastikan semua target masih dibuat.

4. Build menggunakan Bazel

Anda telah mem-build project menggunakan Bazel saat menambahkan file BUILD untuk memvalidasi penyiapan build.

Jika sudah memiliki file BUILD dengan perincian yang diinginkan, Anda dapat menggunakan Bazel untuk menghasilkan semua build.