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, herBUILD
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 birBUILD
dosyası eklemektir.
Maven'den Bazel'e Göç
Aşağıdaki adımlarda projenizi Bazel'a nasıl taşıyacağınız açıklanmaktadır:
- WORKSPACE dosyası oluşturma
- Bir BUILD dosyası oluşturma
- Daha fazla BUILD dosyası oluştur
- 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.
WORKSPACE
dosyanızla aynı dizinde bir metin dosyası oluşturun ve dosyayıBUILD
olarak adlandırın.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ızjava_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.
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ı dizininizdekibazel 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 hedeflerindeps
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çeglob()
ile eşleşen dosyaların küçüleceğini unutmayın.main
dizinine herBUILD
dosyası eklediğinizde, ilgilitest
dizinineBUILD
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çinbazel 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.