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
- 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 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,BUILD
dosyası başına birden fazla derleme dosyasını ve birden fazla hedefi destekler. Böylece Maven'den daha artımlı derlemeler elde edilir. - 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 ekledikçe Bazel ile yeni
BUILD
dosyaları eklemeniz gerekebilir. En iyi uygulama, her yeni Java paketine birBUILD
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:
- MODULE.bazel dosyasını oluşturma
- Bir BUILD dosyası oluşturma
- Daha fazla BUILD dosyası oluşturma
- 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 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. 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'den 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.
MODULE.bazel
dosyanızla aynı dizinde bir metin dosyası oluşturun ve dosyayıBUILD
olarak adlandırın.Bu
BUILD
dosyasında uygun kuralı kullanarak projenizi derleyecek bir hedef oluşturun. 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 özelliğini 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.
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ı dizininizdenbazel 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şlama
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:
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ı)
İlk derlemenizi tamamladıktan sonra gördüğünüz gibi, Bazel 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 hedefe sahip birden fazla BUILD
dosyası, derlemeye daha fazla ayrıntı sağlar ve böylece:
- düzenli toplantılar yapmak,
- 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ı 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 fazla bağımlılığa sahip paketlere doğru ilerleyin. BUILD
dosyalarını ekleyip hedef belirlerken bu yeni hedefleri, hedeflerindeps
bölümlerine ekleyin.glob()
işlevinin paket sınırlarını aşmadığını unutmayın. Bu nedenle, paket sayısı arttıkçaglob()
ile eşleşen dosya sayısı azalır.- Bir
main
dizineBUILD
dosyası eklediğinizde, ilgilitest
dizine deBUILD
dosyası eklediğinizden emin olun. - Paketler arasında görünürlüğü uygun şekilde sınırlandırmaya dikkat edin.
BUILD
dosyalarınızın kurulumundaki hataları giderme işlemini basitleştirmek için her bir derleme dosyasını eklerken projenin Bazel ile derlemeye devam etmesini sağlayın. Tüm hedeflerinizin hâlâ derlendiğinden emin olmak içinbazel build //...
komutunu çalıştırın.
4. Bazel 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.