Bermigrasi dari Maven ke Bazel

Laporkan masalah Lihat sumber Per Malam · 7,2 · 7,1 · 7,0 · 6,5 · 6,4

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 file BUILD, 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 file BUILD ke setiap paket Java baru.

Bermigrasi dari Maven ke Bazel

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

  1. Membuat file WORKSPACE
  2. Buat satu file BUILD
  3. Buat file BUILD lainnya
  4. Membuat 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.

  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 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 alat generate_workspace, dependensi untuk java_library adalah library yang tercantum dalam Makro generated_java_libraries.
    • Lihat contoh di bawah file BUILD tingkat atas ini dari migrasi project Guava.

  3. 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, gunakan bazel 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 ke deps bagian target yang bergantung padanya. Perhatikan bahwa glob() tidak melintasi batas paket, sehingga jumlah paket meningkatkan jumlah 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 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 . Jalankan bazel 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.