Maven'den Bazel'e Geçiş

Sorun bildirme Kaynağı görüntüleme Nightly · 8.0 . 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

Bu sayfada, ön koşullar ve yükleme adımları da dahil olmak üzere Maven'den Bazel'e nasıl geçiş yapılacağı açıklanmaktadır. Bu makalede, Maven ile Bazel arasındaki farklar açıklanmakta ve Guava projesini kullanan bir taşıma örneği sunulmaktadır.

Herhangi bir derleme aracından Bazel'e geçiş yaparken geliştirme ekibinizi, CI sisteminizi ve diğer ilgili sistemleri tamamen taşıyana kadar her iki derleme aracının da paralel olarak çalışması en iyisidir. Maven ve Bazel'i aynı depoda çalıştırabilirsiniz.

Başlamadan önce

  • Henüz yüklemediyseniz Bazel'i yükleyin.
  • Bazel'i kullanmaya yeni başladıysanız taşıma işlemine başlamadan önce Bazel'e Giriş: Java Derleme başlıklı eğitimden yararlanın. Eğitimde Bazel'in kavramları, yapısı ve etiket söz dizimi açıklanmaktadır.

Maven ile Bazel arasındaki farklar

  • Maven, üst düzey pom.xml dosyaları kullanır. Bazel, Maven'den daha artımlı derlemeler yapılmasına olanak tanıyan birden fazla derleme dosyası ve BUILD dosyası başına birden fazla hedefi destekler.
  • Maven, dağıtım işlemiyle ilgili adımlardan sorumludur. Bazel, dağıtımı otomatikleştirmez.
  • Bazel, diller arasındaki bağımlılıkları ifade etmenizi sağlar.
  • Projeye yeni bölümler eklerken Bazel ile yeni BUILD dosyaları eklemeniz gerekebilir. En iyi uygulama, her yeni Java paketine bir BUILD dosyası eklemektir.

Maven'den Bazel'e geçiş

Aşağıdaki adımlarda, projenizi Bazel'e nasıl taşıyacağınız açıklanmaktadır:

  1. MODULE.bazel dosyasını oluşturma
  2. Bir BUILD dosyası oluşturma
  3. Daha fazla BUILD dosyası oluşturma
  4. Bazel'i kullanarak derleme

Aşağıdaki örnekler, Guava projesinin Maven'den Bazel'e taşınmasından alınmıştır. Kullanılan Guava projesi v31.1 sürümüdür. Guava'yı kullanan örneklerde taşıma işleminin her adımı açıklanmaz ancak taşıma işlemi için oluşturulan veya manuel olarak eklenen dosyalar ve içerikler gösterilir.

$ git clone https://github.com/google/guava.git && cd guava
$ git checkout v31.1

1. MODULE.bazel dosyasını oluşturma

Projenizin kökünde MODULE.bazel adlı bir dosya oluşturun. Projenizde harici bağımlılık yoksa bu dosya boş olabilir.

Projeniz, projenin dizinlerinden birinde bulunmayan dosyalara veya paketlere bağlıysa bu harici bağımlılıkları MODULE.bazel dosyasında belirtin. Maven'deki bağımlılıkları yönetmek için rules_jvm_external'ü kullanabilirsiniz. Bu kural kümesinin kullanımıyla ilgili talimatlar için README dosyasını inceleyin.

Guava proje örneği: harici bağımlılıklar

Guava projesinin dış bağımlılıkları rules_jvm_external kural kümesiyle listelenir.

MODULE.bazel dosyasına aşağıdaki snippet'i ekleyin:

bazel_dep(name = "rules_jvm_external", version = "6.2")
maven = use_extension("@rules_jvm_external//:extensions.bzl", "maven")
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",
    ],
)
use_repo(maven, "maven")

2. Bir BUILD dosyası oluşturun

Çalışma alanınızı tanımladığınıza ve harici bağımlılıkları (varsa) listelediğinize göre, projenizin nasıl derlenmesi gerektiğini açıklamak için BUILD dosyaları oluşturmanız gerekir. Tek bir pom.xml dosyasına sahip Maven'in aksine Bazel, proje oluşturmak için birçok BUILD dosyası kullanabilir. Bu dosyalar, Bazel'in artımlı derlemeler oluşturmasına olanak tanıyan birden fazla derleme hedefi belirtir.

BUILD dosyalarını aşamalı olarak ekleyin. Projenizin köküne bir BUILD dosyası ekleyerek ve Bazel'i kullanarak ilk derleme yapmak için bu dosyayı kullanarak başlayın. Ardından, daha ayrıntılı hedefler içeren daha fazla BUILD dosyası ekleyerek derlemenizi hassaslaştırırsınız.

  1. MODULE.bazel dosyanızla aynı dizinde bir metin dosyası oluşturun ve dosyayı BUILD olarak adlandırın.

  2. Bu BUILD dosyasında, projenizi oluşturmak için bir hedef oluşturmak üzere uygun kuralı kullanın. Aşağıda bazı ipuçları verilmiştir:

    • Uygun kuralı kullanın:

      • Tek bir Maven modülü içeren projeler oluşturmak için java_library kuralını aşağıdaki gibi kullanın:

        java_library(
           name = "everything",
           srcs = glob(["src/main/java/**/*.java"]),
           resources = glob(["src/main/resources/**"]),
           deps = ["//:all-external-targets"],
        )
        
      • Birden fazla Maven modülü içeren projeler oluşturmak için java_library kuralını aşağıdaki gibi kullanın:

        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"],
        )
        
      • İkili dosyalar oluşturmak için java_binary kuralını kullanın:

        java_binary(
           name = "everything",
           srcs = glob(["src/main/java/**/*.java"]),
           resources = glob(["src/main/resources/**"]),
           deps = ["//:all-external-targets"],
           main_class = "com.example.Main"
        )
        
      • Özellikleri belirtin:

        • name: Hedefe anlamlı bir ad verin. Yukarıdaki örneklerde hedef "her şey" olarak adlandırılmıştır.
        • srcs: Projenizdeki tüm .java dosyalarını listelemek için glob ifadesi kullanın.
        • resources: Projenizdeki tüm kaynakları listelemek için glob özelliğini kullanın.
        • deps: Projenizin hangi harici bağımlılıklara ihtiyacı olduğunu belirlemeniz gerekir.
      • Guava projesinin taşınmasıyla ilgili bu üst düzey BUILD dosyasının örneğine göz atın.

  3. Projenizin kökünde bir BUILD dosyanız olduğuna göre, projenizin çalıştığından emin olmak için derleyin. Projenizi Bazel ile derlemek için komut satırında, çalışma alanı dizininizden bazel build //:everything simgesini kullanın.

    Proje, Bazel ile başarıyla derlendi. Projenin artımlı derlemelerine izin vermek için daha fazla BUILD dosyası eklemeniz gerekir.

Guava projesi örneği: Bir BUILD dosyasıyla başlayın

Guava projesi Bazel'e taşınırken projenin tamamının derlenmesi için başlangıçta bir BUILD dosyası kullanılır. Çalışma alanı dizinindeki bu ilk BUILD dosyasının içeriği aşağıda verilmiştir:

java_library(
    name = "everything",
    srcs = glob([
        "guava/src/**/*.java",
        "futures/failureaccess/src/**/*.java",
    ]),
    javacopts = ["-XepDisableAllChecks"],
    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. Daha fazla BUILD dosyası oluşturma (isteğe bağlı)

Bazel, ilk derlemeniz tamamlandıktan sonra gördüğünüz gibi yalnızca bir BUILD file ile çalışır. Ayrıntılı hedefler içeren daha fazla BUILD dosyası ekleyerek derlemeyi daha küçük parçalara ayırmayı düşünmeniz önerilir.

Birden fazla hedefi olan birden fazla BUILD dosyası, derlemeye daha fazla ayrıntı düzeyi kazandırır ve aşağıdakilere olanak tanır:

  • Projenin artımlı derleme sayısını artırabilir.
  • derlemenin paralel yürütme hızını artırır.
  • Gelecekteki kullanıcılar için derlemenin daha iyi sürdürülebilirliği ve
  • Paketler arasındaki hedeflerin görünürlüğünü kontrol etme, uygulama ayrıntılarını içeren kitaplıkların herkese açık API'lere sızması gibi sorunları önleyebilir.

Daha fazla BUILD dosyası eklemeyle ilgili ipuçları:

  • Her Java paketine bir BUILD dosyası ekleyerek başlayabilirsiniz. En az bağımlılığa sahip Java paketleriyle başlayın ve en fazla bağımlılığa sahip paketlere doğru ilerleyin.
  • BUILD dosyaları ekleyip hedefleri belirtirken bu yeni hedefleri, bunlara bağlı hedeflerin deps bölümlerine ekleyin. glob() işlevinin paket sınırlarını aşmadığını unutmayın. Bu nedenle, paket sayısı arttıkça glob() ile eşleşen dosya sayısı azalır.
  • main dizinine BUILD dosyası eklediğinizde, ilgili test dizinine de BUILD dosyası eklediğinizden emin olun.
  • Paketler arasındaki görünürlüğü doğru şekilde sınırlandırın.
  • BUILD dosyalarınızın kurulumundaki hataları gidermeyi kolaylaştırmak için her derleme dosyasını eklerken projenin Bazel ile derlemeye devam etmesini sağlayın. Tüm hedeflerinizin hâlâ derlendiğinden emin olmak için bazel build //... komutunu çalıştırın.

4. Bazel'i kullanarak derleme

Derlemenin kurulumunu doğrulamak için BUILD dosyaları eklerken Bazel'i kullanarak derleme yapıyorsunuz.

İstediğiniz ayrıntı düzeyinde BUILD dosyanız olduğunda tüm derlemelerinizi oluşturmak için Bazel'i kullanabilirsiniz.