Maven'den Bazel'e Geçiş

Sorun bildir Kaynağı göster

Bu sayfada, ön koşullar ve yükleme adımları dahil olmak üzere Maven'den Bazel'e nasıl geçiş yapılacağı açıklanmaktadır. Raporda Maven ve Bazel arasındaki farklar açıklanmakta ve Guava projesi kullanılarak yapılan bir taşıma örneği sağlanmaktadı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'ı aynı depoda çalıştırabilirsiniz.

Başlamadan önce

  • Henüz yüklenmediyse Bazel'i yükleyin.
  • Bazel'i kullanmaya yeni başladıysanız taşıma işlemine başlamadan önce Bazel'e Giriş: Java'yı Derleme eğiticisini inceleyin. Eğiticide, Bazel'ın kavramları, yapısı ve etiket söz dizimi açıklanmaktadır.

Maven ve Bazel arasındaki farklar

  • Maven üst düzey pom.xml dosya kullanır. Bazel, her BUILD dosyası için birden fazla derleme dosyasını ve birden çok hedefi destekler. Böylece, Maven'den daha artımlı derlemelere olanak tanır.
  • Maven, dağıtım sürecinin adımlarından sorumludur. Bazel, dağıtımı otomatikleştirmez.
  • Bazel, diller arasındaki bağımlılıkları ifade etmenizi sağlar.
  • Projeye yeni bölümler ekledikçe Bazel ile yeni BUILD dosyaları da eklemeniz gerekebilir. En iyi uygulama, her yeni Java paketine bir BUILD dosyası eklemektir.

Maven'den Bazel'e Göç

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

  1. WORKSPACE dosyası oluşturma
  2. Bir BUILD dosyası oluşturma
  3. Daha fazla BUILD dosyası oluştur
  4. Bazel kullanarak oluşturma

Aşağıdaki örnekler Guava projesinin Maven'den Bazel'e taşınmasından alınmıştır. Kullanılan Guava projesinin sürümü v31.1. Guava kullanan örnekler taşıma işleminin her adımını adım adım açıklamaz ancak taşıma için manuel olarak oluşturulan veya eklenen dosya ve içerikleri gösterir.

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

1. WORKSPACE dosyasını oluşturma

Projenizin kök dizininde WORKSPACE adlı bir dosya oluşturun. Projenizde harici bağımlılık yoksa çalışma alanı dosyası boş olabilir.

Projeniz projenin dizinlerinden birinde olmayan dosyalara veya paketlere bağımlıysa bu harici bağımlılıkları çalışma alanı dosyasında belirtin. Çalışma alanı dosyası için harici bağımlılıkların listelenmesini otomatikleştirmek amacıyla rules_jvm_external işlevini kullanın. Bu kural kümesini kullanma talimatları için BENİOKU sayfasını inceleyin.

Guava projesi örneği: dış bağımlılıklar

rules_jvm_external kural kümesiyle Guava projesinin harici bağımlılıklarını listeleyebilirsiniz.

WORKSPACE dosyasına aşağıdaki snippet'i ekleyin:

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. Bir BUILD dosyası oluşturma

Çalışma alanınızı tanımladığınıza ve harici bağımlılıkları (varsa) listelediğinize göre projenizin nasıl oluşturulması gerektiğini açıklayan 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, birden fazla derleme hedefi belirtir. Bu hedef, Bazel'ın artımlı derlemeler oluşturmasına olanak tanır.

BUILD dosyayı aşamalar halinde ekleyin. Projenizin kök dizinine bir BUILD dosyası ekleyip bu dosyayı Bazel kullanarak ilk derleme yapmak için kullanın. Ardından, daha ayrıntılı hedeflere sahip daha fazla BUILD dosyası ekleyerek derlemenizi hassaslaştırırsınız.

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

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

    • Uygun kuralı kullanın:

      • Tek bir Maven modülüyle 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 programlar 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 globbing'i kullanın.
      • resources: Projenizdeki tüm kaynakları listelemek için globbing'i kullanın.
      • deps: Projenizin hangi dış bağımlılıklara ihtiyacı olduğunu belirlemeniz gerekir. Örneğin, generate_workspace aracını kullanarak bir dış bağımlılıklar listesi oluşturduysanız java_library için bağımlılıklar, generated_java_libraries makrosunda listelenen kitaplıklardır.
    • Guava projesi taşıma işlemiyle ilgili aşağıdaki üst düzey BUILD dosyası örneğine göz atın.

  3. Artık projenizin kök dizininde bir BUILD dosyanız olduğuna göre, projenizin çalıştığından emin olmak için projenizi derleyebilirsiniz. Projenizi Bazel ile oluşturmak için komut satırında, çalışma alanı dizininizdeki bazel build //:everything kodunu kullanın.

    Proje artık Bazel ile başarılı bir şekilde oluşturuldu. Projenin kademeli derlemelerine olanak tanımak için daha fazla BUILD dosyası eklemeniz gerekir.

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

Guava projesini Bazel'e taşırken projenin tamamını oluşturmak için başlangıçta bir BUILD dosyası kullanılır. Çalışma alanı dizinindeki bu ilk BUILD dosyasının içeriği şu şekildedir:

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şturun (isteğe bağlı)

Bazel, ilk derlemenizi tamamladıktan sonra gördüğünüz gibi yalnızca bir BUILD file ile çalışır. Yine de ayrıntılı hedeflerle daha fazla BUILD dosyası ekleyerek derlemeyi daha küçük parçalara bölebilirsiniz.

Birden çok hedefe sahip birden fazla BUILD dosyası, derlemenin ayrıntı düzeyini artırır ve aşağıdakilere olanak tanır:

  • projenin kademeli olarak geliştirilmesini sağlar.
  • paralel yürütmenin artması,
  • derlemenin gelecekteki kullanıcılar için daha iyi sürdürülebilirlik ve
  • Paketler arasındaki hedeflerin görünürlüğünü kontrol edebilir. Bu da uygulama ayrıntılarını içeren kitaplıklar gibi sorunların herkese açık API'lere sızmasını önleyebilir.

Daha fazla BUILD dosyası eklemek için 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 hedefler belirttikçe, bu yeni hedefleri bunlara bağlı olan hedeflerin deps bölümüne ekleyin. glob() işlevinin paket sınırlarını aşmadığını, bu nedenle paket sayısı büyüdükçe glob() ile eşleşen dosyaların küçüleceğini unutmayın.
  • main dizinine her BUILD dosyası eklediğinizde, ilgili test dizinine BUILD dosyası eklediğinizden emin olun.
  • Paketler arasında görünürlüğü düzgün şekilde sınırlamaya dikkat edin.
  • BUILD dosyası kurulumunuzdaki hataları gidermeyi kolaylaştırmak için, her derleme dosyasını eklerken projenin Bazel ile derlemeye devam ettiğinden emin olun. Tüm hedeflerinizin oluşturulmaya devam etmesi için bazel build //... çalıştırın.

4. Bazel kullanarak oluşturma

Derlemenin kurulumunu doğrulamak için BUILD dosyalarını eklerken Bazel kullanarak derleme oluşturuyorsunuz.

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