Maven'den Bazel'e Geçiş

Sorun bildir Kaynağı görüntüle Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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. Maven ile Bazel arasındaki farklar açıklanır ve Guava projesi kullanılarak bir taşıma örneği verilir.

Herhangi bir derleme aracından Bazel'e geçiş yaparken geliştirme ekibinizi, sürekli entegrasyon sisteminizi ve ilgili diğer tüm 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üklenmediyse Bazel'i yükleyin.
  • Bazel'i yeni kullanmaya başladıysanız geçiş işlemine başlamadan önce Introduction to Bazel: Build Java (Bazel'e Giriş: Java Oluşturma) adlı eğitime göz atın. Bu 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ını kullanır. Bazel, Maven'in derlemelerinden daha artımlı olan derlemelere olanak tanıyarak birden fazla derleme dosyası ve BUILD dosyası başına birden fazla hedefi destekler.
  • Maven, dağıtım sürecindeki adımları yönetir. Bazel, dağıtımı otomatikleştirmez.
  • Bazel, diller arasındaki bağımlılıkları ifade etmenize olanak tanır.
  • Projeye yeni bölümler ekledikçe Bazel ile yeni BUILD dosyalar eklemeniz gerekebilir. En iyi uygulama, her yeni Java paketine bir BUILD dosyası eklemektir.

Maven'den Bazel'e taşıma

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

  1. WORKSPACE dosyasını oluşturma
  2. Tek bir BUILD dosyası oluşturma
  3. Daha fazla BUILD dosyası oluşturma
  4. Bazel kullanarak derleme

Aşağıdaki örnekler, Guava projesinin Maven'dan Bazel'e taşınmasıyla ilgilidir. Kullanılan Guava projesi v31.1 sürümüdür. Guava'nın kullanıldığı örneklerde taşıma işleminin her adımı açıklanmamaktadır ancak taşıma için oluşturulan veya manuel olarak eklenen dosyalar ve içerikler gösterilmektedir.

$ 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. Projenizin harici bağımlılıkları yoksa çalışma alanı dosyası boş olabilir.

Projeniz, proje dizinlerinden birinde bulunmayan dosyalara veya paketlere bağlı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 istiyorsanız rules_jvm_external kullanın. Bu kural grubunun kullanımıyla ilgili talimatlar için README dosyasını inceleyin.

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

Guava projesinin dış bağımlılıklarını rules_jvm_external kurallar grubuyla 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şturun.

Çalışma alanınızı tanımlayıp harici bağımlılıkları (varsa) listeledikten sonra projenizin nasıl oluşturulması gerektiğini açıklayan BUILD dosyaları oluşturmanız gerekir. Tek bir pom.xml dosyası olan Maven'in aksine Bazel, bir projeyi 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 dosyayı aşamalar halinde ekleyin. Projenizin kök dizinine bir BUILD dosyası ekleyerek ve bu dosyayı kullanarak Bazel ile ilk derlemeyi yaparak başlayın. Ardından, daha ayrıntılı hedeflere sahip daha fazla BUILD dosyası ekleyerek derlemenizi iyileştirirsiniz.

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

  2. Bu BUILD dosyasında, projenizi oluşturmak için tek 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üyle proje 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 "everything" olarak adlandırılır.
      • srcs: Projenizdeki tüm .java dosyalarını listelemek için globbing kullanın.
      • resources: Projenizdeki tüm kaynakları listelemek için globbing kullanın.
      • deps: Projenizin hangi harici bağımlılıklara ihtiyacı olduğunu belirlemeniz gerekir. Örneğin, generate_workspace aracını kullanarak harici bağımlılıkların listesini oluşturduysanız java_library bağımlılıkları, generated_java_libraries makrosunda listelenen kitaplıklardır.
    • Guava projesinin taşınmasıyla ilgili bu üst düzey BUILD dosyasının aşağıdaki ö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 oluşturun. Komut satırında, çalışma alanı dizininizden bazel build //:everything komutunu kullanarak projenizi Bazel ile oluşturun.

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

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

Guava projesi Bazel'e taşınırken başlangıçta tüm projeyi oluşturmak için tek bir BUILD dosyası kullanılır. Çalışma alanı dizinindeki bu ilk BUILD dosyanın içeriği:

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. Daha fazla BUILD dosyası oluşturma (isteğe bağlı)

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

Birden fazla hedef içeren birden fazla BUILD dosyası, derlemeye daha fazla ayrıntı düzeyi kazandırarak şunlara olanak tanır:

  • projenin artımlı derlemelerinin artması,
  • derlemenin paralel yürütülmesini artırır,
  • Gelecekteki kullanıcılar için derlemenin daha iyi bakımı ve
  • Paketler arasındaki hedeflerin görünürlüğünü kontrol ederek, kitaplıkların herkese açık API'lere sızan uygulama ayrıntılarını içermesi gibi sorunları önleyebilirsiniz.

Daha fazla BUILD dosya eklemeyle ilgili ipuçları:

  • Her Java paketine bir BUILD dosyası ekleyerek başlayabilirsiniz. En az bağımlılığı olan Java paketleriyle başlayın ve en çok bağımlılığı olan paketlere doğru ilerleyin.
  • BUILD dosyaları ekleyip hedefleri belirlerken bu yeni hedefleri, kendilerine bağlı olan 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 dosyalar azalır.
  • BUILD dosyasını main dizinine her eklediğinizde, ilgili test dizinine de BUILD dosyası eklediğinizden emin olun.
  • Paketler arasındaki görünürlüğü uygun şekilde sınırlamaya dikkat edin.
  • BUILD dosyalarının kurulumunda hataları gidermeyi kolaylaştırmak için her bir derleme dosyasını eklerken projenin Bazel ile derlenmeye devam ettiğinden emin olun. Tüm hedeflerinizin oluşturulmaya devam ettiğinden emin olmak için bazel build //... komutunu çalıştırın.

4. Bazel kullanarak derleme

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

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