Maven'den Bazel'e Geçiş

Sorun bildirin Kaynağı göster

Bu sayfada, ön koşullar ve yükleme adımlarıyla birlikte Maven'den Bazel'e nasıl geçiş yapılacağı açıklanmaktadır. Maven ile Bazel arasındaki farklar açıklanmış ve Guava projesini kullanarak bir taşıma örneği sağlanmıştır.

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

Başlamadan önce

  • Yüklü değilse 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'in kavramları, yapısı ve etiket söz dizimi açıklanmaktadır.

Maven ile Bazel arasındaki farklar

  • Maven üst düzey pom.xml dosya kullanır. Bazel, birden fazla derleme dosyasını ve BUILD dosyası başına birden fazla hedefi destekler. Böylece Maven'den daha fazla artımlı derlemeler yapabilirsiniz.
  • 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ı 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. WORKSPACE dosyasını oluşturun
  2. Bir BUILD dosyası oluşturun
  3. Daha fazla BUILD dosyası oluşturun
  4. Bazel 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 tarihinde yayınlandı. Guava kullanan örnekler, taşıma işleminin her adımını göstermez ancak taşıma işlemi 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şturun

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

Projeniz projenin dizinlerinden birinde yer almayan dosyalara veya paketlere dayanıyorsa 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 kullanın. Bu kural kümesini kullanma talimatları için BENİ OKU'yu inceleyin.

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

Guava projesinin harici bağımlılıklarını rules_jvm_external kuralıyla 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

Artık çalışma alanınızı tanımladığınıza ve varsa harici bağımlılıkları (varsa) listelediğinize göre projenizin nasıl oluşturulması gerektiğini açıklamak için BUILD dosyaları oluşturmanız gerekir. Tek bir pom.xml dosyası olan 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 belirler.

BUILD dosyayı aşamalar halinde ekleyin. Projenizin köküne bir BUILD dosyası ekleyerek ve bu dosyayı Bazel ile ilk derlemeyi yapmak için kullanarak başlayı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 oluşturduğunuz dosyaya BUILD adını verin.

  2. Bu BUILD dosyasında, projenizi oluşturmak üzere bir hedef oluşturmak için 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ü olan 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 hedefe "her şey" denir.
      • 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 ihtiyaç duyduğunu belirlemeniz gerekiyor. Örneğin, generate_workspace aracını kullanarak dış bağımlılıkların listesini oluşturduysanız java_library için bağımlılıklar, generated_java_libraries makrosunda listelenen kitaplıklardır.
    • Guava projesinin taşınmasıyla ilgili bu üst düzey DERLEME dosyasının bulunduğu örneğe göz atın.

  3. Artık projenizin kökünde bir BUILD dosyası olduğuna göre, çalıştığından emin olmak için projenizi derleyin. Çalışma alanı dizininizdeki komut satırında, Bazel ile projenizi derlemek için bazel build //:everything komutunu kullanın.

    Proje artık Bazel ile başarıyla tamamlanmış durumda. Projenin artımlı derlemelerine olanak tanımak için daha fazla BUILD dosyası eklemeniz gerekir.

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

Guava projesini Bazel'e taşırken, projenin tamamını derlemek için başlangıçta bir BUILD dosyası kullanılır. Çalışma alanı dizinindeki bu ilk BUILD dosyasını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şturun (isteğe bağlı)

İlk derlemenizi tamamladıktan sonra gördüğünüz gibi, Bazel yalnızca bir BUILD file ile çalışır. Ayrıntılı hedeflere sahip daha fazla BUILD dosyası ekleyerek derlemeyi daha küçük parçalara ayırmayı düşünmeniz gerekir.

Birden fazla hedefe sahip birden fazla BUILD dosyası, derlemeye daha fazla ayrıntı sağlar ve böylece:

  • düzenli toplantılar yapmak,
  • paralel olarak yürütülürse
  • ve derlemenin gelecekteki kullanıcılar için daha iyi korunmasını ve
  • Paketler arasındaki hedeflerin görünürlüğünü kontrol ederek herkese açık API'lere sızdırılan uygulama ayrıntılarını içeren kitaplıklar gibi sorunları önleyebilirsiniz.

Daha fazla BUILD dosyası ekleme ile 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 çok bağımlı olan paketlere kadar ilerleyin.
  • BUILD dosyalarını ekleyip hedef belirlerken bu yeni hedefleri, hedeflerin deps bölümlerine ekleyin. glob() işlevinin paket sınırlarını geçmediğini, bu nedenle paket sayısı arttıkça glob() ile eşleşen dosyaların küçüleceğini unutmayın.
  • main dizinine BUILD dosyası eklediğinizde ilgili test dizinine bir BUILD dosyası eklediğinizden emin olun.
  • Paketler arasında görünürlüğü uygun şekilde sınırlandırmaya dikkat edin.
  • BUILD dosyası kurulumunuzdaki hatalarla ilgili sorunları 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 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'ı kullanarak derlersiniz.

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