Bu sayfa, Bazel'i Java projeleriyle kullanmanıza yardımcı olacak kaynaklar içerir. Bu videoda bir eğiticiye, derleme kurallarına ve Bazel ile Java projeleri oluşturmaya özel diğer bilgilere bağlantı verilmiştir.
Bazel ile çalışma
Aşağıdaki kaynaklar, Java projelerinde Bazel ile çalışmanıza yardımcı olacaktır:
Bazel'e geçiş
Şu anda Java projelerinizi Maven ile derliyorsanız Maven projelerinizi Bazel ile oluşturmaya başlamak için taşıma kılavuzundaki adımları uygulayın:
Java sürümleri
Yapılandırma bayraklarıyla ayarlanmış iki alakalı Java sürümü vardır:
- kaynak dosyaların kod deposundaki sürümleri
- kodu yürütmek ve test etmek için kullanılan Java çalışma zamanı sürümünü
Kod deponuzdaki kaynak kodun sürümünü yapılandırma
Ek yapılandırma olmadan, Bazel, depodaki tüm Java kaynak dosyalarının tek bir Java sürümünde yazıldığını varsayar. Kod deposundaki kaynakların sürümlerini belirtmek için .bazelrc
dosyasına build --java_language_version={ver}
ekleyin. Burada {ver}
, örneğin 11
olur. Bazel deposu sahipleri, bu işareti Bazel'in ve kullanıcılarının kaynak kodun Java sürüm numarasına başvurabileceği şekilde ayarlamalıdır. Daha fazla bilgi için Java dili sürümü işareti bölümüne bakın.
Kodu yürütmek ve test etmek için kullanılan JVM'yi yapılandırma
Bazel, derleme için bir JDK, kodu yürütmek ve test etmek için ise başka bir JDK kullanır.
Varsayılan olarak Bazel, kodu indirdiği bir JDK'yı kullanarak derler ve yerel makinede yüklü JVM ile kodu yürütüp test eder. Bazel, JAVA_HOME
veya yolu kullanarak JVM arar.
Ortaya çıkan ikili programlar, sistem kitaplıklarında yerel olarak yüklenen JVM ile uyumludur. Yani sonuçta ortaya çıkan ikili programlar, makinede nelerin yüklü olduğuna bağlıdır.
Yürütme ve test amacıyla kullanılan JVM'yi yapılandırmak için --java_runtime_version
işaretini kullanın. Varsayılan değer: local_jdk
.
Hermetik test ve derleme
Hermetik derleme oluşturmak için komut satırı işaretini --java_runtime_version=remotejdk_11
kullanabilirsiniz. Kod, uzak bir depodan indirilen JVM için derlenir, çalıştırılır ve test edilir. Daha fazla bilgi için Java çalışma zamanı sürümü işareti bölümüne bakın.
Java'da derleme araçlarının derlemesini ve yürütülmesini yapılandırma
Araçları derleyip yürütmek için kullanılan ikinci bir JDK ve JVM çifti daha vardır. Bunlar, derleme işleminde kullanılır ancak derleme sonuçlarında yer almaz. Bu JDK ve JVM, --tool_java_language_version
ve --tool_java_runtime_version
ile kontrol edilir. Varsayılan değerler sırasıyla 11
ve remotejdk_11
'dir.
Yerel olarak yüklenmiş JDK ile derleme
Varsayılan olarak Bazel, JDK'nın dahili öğelerini geçersiz kıldığından uzak JDK kullanılarak derlenir. Yerel olarak yüklenen JDK'yı kullanan derleme araç zincirleri yapılandırılır, ancak kullanılmaz.
Yerel olarak yüklenen JDK'yi (yerel JDK için derleme araç zincirlerini) kullanarak derlemek için ek --extra_toolchains=@local_jdk//:all
işaretini kullanın. Ancak bu işlemin rastgele tedarikçilerin JDK'sında çalışmayabileceğini unutmayın.
Daha fazla ayrıntı için Java araç zincirlerini yapılandırma bölümüne bakın.
En iyi uygulamalar
Genel Bazel en iyi uygulamalarına ek olarak, aşağıda Java projelerine özel en iyi uygulamaları bulabilirsiniz.
Dizin yapısı
Maven'in standart dizin düzenini tercih edin (src/main/java
altındaki kaynaklar, src/test/java
altındaki testler).
BUILD dosyaları
BUILD
dosyalarınızı oluştururken aşağıdaki yönergeleri izleyin:
Derleme performansını artırdığı için Java kaynaklarını içeren dizin başına bir
BUILD
dosyası kullanın.Her
BUILD
dosyası, aşağıdaki gibi görünen birjava_library
kuralı içermelidir:java_library( name = "directory-name", srcs = glob(["*.java"]), deps = [...], )
Kitaplığın adı,
BUILD
dosyasını içeren dizinin adı olmalıdır. Bu,"//package:package"
yerine"//package"
kullanan kitaplığın etiketini kısaltır.Kaynaklar, dizindeki tüm Java dosyalarının yinelemesiz bir
glob
öğesi olmalıdır.Testler,
src/test
altında eşleşen bir dizinde olmalı ve bu kitaplığa bağımlı olmalıdır.
Gelişmiş Java derlemeleri için yeni kurallar oluşturma
Not: Yeni kurallar oluşturma işlemi, gelişmiş derleme ve test senaryoları için yapılabilir. Bazel'i kullanmaya başlarken buna ihtiyacınız yoktur.
Aşağıdaki modüller, yapılandırma parçaları ve sağlayıcılar, Java projelerinizi oluştururken Bazel'in özelliklerini artırmanıza yardımcı olur:
- Ana Java modülü:
java_common
- Ana Java sağlayıcısı:
JavaInfo
- Yapılandırma parçası:
java
Diğer modüller:
Java araç zincirlerini yapılandırma
Bazel iki tür Java araç zinciri kullanır:
- yürütme, Java ikili programlarını yürütmek ve test etmek için kullanılır, --java_runtime_version
işareti ile kontrol edilir
- derleme, Java kaynaklarını derlemek için kullanılır, --java_language_version
işaretiyle kontrol edilir
Ek yürütme araç zincirlerini yapılandırma
Yürütme araç zinciri; sürümü, işletim sistemi ve CPU mimarisi hakkında bazı ek bilgiler içeren yerel veya bir depodan alınan JVM'dir.
Java yürütme araç zincirleri, WORKSPACE
dosyasına local_java_repository
veya remote_java_repository
kuralları kullanılarak eklenebilir. Kuralın eklenmesi JVM'yi bir işaret kullanılarak kullanılabilir hale getirir. Aynı işletim sistemi ve CPU mimarisi için birden fazla tanım verildiğinde ilki kullanılır.
Örnek yerel JVM yapılandırması:
load("@bazel_tools//tools/jdk:local_java_repository.bzl", "local_java_repository")
local_java_repository(
name = "additionaljdk", # Can be used with --java_runtime_version=additionaljdk, --java_runtime_version=11 or --java_runtime_version=additionaljdk_11
version = 11, # Optional, if not set it is autodetected
java_home = "/usr/lib/jdk-15/", # Path to directory containing bin/java
)
Uzak JVM örneği yapılandırması:
load("@bazel_tools//tools/jdk:remote_java_repository.bzl", "remote_java_repository")
remote_java_repository(
name = "openjdk_canary_linux_arm",
prefix = "openjdk_canary", # Can be used with --java_runtime_version=openjdk_canary_11
version = "11", # or --java_runtime_version=11
target_compatible_with = [ # Specifies constraints this JVM is compatible with
"@platforms//cpu:arm",
"@platforms//os:linux",
],
urls = ..., # Other parameters are from http_repository rule.
sha256 = ...,
strip_prefix = ...
)
Ek derleme araç zincirlerini yapılandırma
Derleme araç zinciri, JDK ve Bazel'in derleme sırasında kullandığı ve çeşitli ek özellikler sağlayan birçok araçtan oluşur. Bu araçlar arasında Hataya Duyarlı, katı Java bağımlılıkları, başlık derlemesi, Android sugaring, kapsam enstrümantasyonu ve IDE'ler için genel sınıf işleme gibi özellikler sunulur.
JavaBuilder, derleme yürüten ve yukarıda bahsedilen özellikleri sağlayan, Bazel tarafından paket halinde sunulan bir araçtır. Gerçek derleme, JDK'nın dahili derleyicisi kullanılarak yürütülür. Derleme için kullanılan JDK, araç zincirinin java_runtime
özelliği tarafından belirtilir.
Bazel, dahili bazı JDK'ları geçersiz kılar. JDK sürüm 9'dan büyük olduğunda java.compiler
ve jdk.compiler
modüllerine JDK'nın --patch_module
işareti kullanılarak yama uygulanır. JDK sürüm 8'de Java derleyicisine -Xbootclasspath
işareti kullanılarak yama uygulanır.
VanillaJavaBuilder, JDK'nın dahili derleyicisini değiştirmeyen ve hiçbir ek özelliğe sahip olmayan JavaBuilder'ın ikinci uygulamasıdır. VanillaJavaBuilder, yerleşik araç zincirlerinin hiçbiri tarafından kullanılmaz.
Bazel, derleme sırasında, JavaBuilder'a ek olarak başka çeşitli araçlar da kullanıyor.
ijar
aracı, çağrı imzaları hariç her şeyi kaldırmak için jar
dosyasını işler. Ortaya çıkan kavanozlara başlık kavanozu denir. Bunlar, yalnızca bir işlevin gövdesi değiştiğinde aşağı akış bağımlılarını yeniden derleyerek derleme artımlılığını iyileştirmek için kullanılır.
singlejar
aracı, birden fazla jar
dosyasını tek bir dosyada toplar.
genclass
aracı, bir Java derlemesinin çıktısını sonradan işler ve yalnızca ek açıklama işlemcileri tarafından oluşturulan kaynaklara ait sınıf dosyalarını içeren bir jar
oluşturur.
JacocoRunner
aracı, Jacoco'yu enstrümanlı dosyalar üzerinde çalıştırır ve sonuçları LCOV biçiminde verir.
TestRunner
aracı, kontrollü bir ortamda JUnit 4 testlerini yürütür.
BUILD
dosyasına default_java_toolchain
makrosu ekleyip bunu WORKSPACE
dosyasına register_toolchains
kuralı ekleyerek veya --extra_toolchains
işaretini kullanarak derlemeyi yeniden yapılandırabilirsiniz.
Araç zinciri yalnızca source_version
özelliği, --java_language_version
işareti tarafından belirtilen değerle eşleştiğinde kullanılır.
Örnek araç zinciri yapılandırması:
load(
"@bazel_tools//tools/jdk:default_java_toolchain.bzl",
"default_java_toolchain", "DEFAULT_TOOLCHAIN_CONFIGURATION", "BASE_JDK9_JVM_OPTS", "DEFAULT_JAVACOPTS"
)
default_java_toolchain(
name = "repository_default_toolchain",
configuration = DEFAULT_TOOLCHAIN_CONFIGURATION, # One of predefined configurations
# Other parameters are from java_toolchain rule:
java_runtime = "@bazel_tools//tools/jdk:remote_jdk11", # JDK to use for compilation and toolchain's tools execution
jvm_opts = BASE_JDK9_JVM_OPTS + ["--enable_preview"], # Additional JDK options
javacopts = DEFAULT_JAVACOPTS + ["--enable_preview"], # Additional javac options
source_version = "9",
)
Bu, --extra_toolchains=//:repository_default_toolchain_definition
kullanılarak veya çalışma temposuna register_toolchains("//:repository_default_toolchain_definition")
eklenerek
kullanılabilir.
Önceden tanımlanmış yapılandırmalar:
DEFAULT_TOOLCHAIN_CONFIGURATION
: tüm özellikler, 9 ve üzeri JDK sürümlerini desteklerVANILLA_TOOLCHAIN_CONFIGURATION
: Ek özellik yoktur, rastgele tedarikçi firmaların JDK'lerini destekler.PREBUILT_TOOLCHAIN_CONFIGURATION
: Varsayılanla aynıdır ancak yalnızca önceden oluşturulmuş araçları kullanır (ijar
,singlejar
)NONPREBUILT_TOOLCHAIN_CONFIGURATION
: varsayılan olarak aynıdır, ancak tüm araçlar kaynaklardan derlenmiştir (bu, farklı libc'ye sahip işletim sisteminde faydalı olabilir)
JVM ve Java derleyici bayraklarını yapılandırma
JVM ve javac flag'lerini flag'lerle veya default_java_toolchain
özellikleriyle yapılandırabilirsiniz.
İlgili işaretler: --jvmopt
, --host_jvmopt
, --javacopt
ve --host_javacopt
.
İlgili default_java_toolchain
özellikleri javacopts
, jvm_opts
, javabuilder_jvm_opts
ve turbine_jvm_opts
'dir.
Pakete özel Java derleyici işaretleri yapılandırması
default_java_toolchain
öğesinin package_configuration
özelliğini kullanarak belirli kaynak dosyalar için farklı Java derleyici işaretleri yapılandırabilirsiniz.
Lütfen aşağıdaki örneği inceleyin.
load("@bazel_tools//tools/jdk:default_java_toolchain.bzl", "default_java_toolchain")
# This is a convenience macro that inherits values from Bazel's default java_toolchain
default_java_toolchain(
name = "toolchain",
package_configuration = [
":error_prone",
],
visibility = ["//visibility:public"],
)
# This associates a set of javac flags with a set of packages
java_package_configuration(
name = "error_prone",
javacopts = [
"-Xep:MissingOverride:ERROR",
],
packages = ["error_prone_packages"],
)
# This is a regular package_group, which is used to specify a set of packages to apply flags to
package_group(
name = "error_prone_packages",
packages = [
"//foo/...",
"-//foo/bar/...", # this is an exclusion
],
)
Tek bir depoda birden çok Java kaynak kodu sürümü
Bazel bir derlemede yalnızca Java kaynaklarının tek bir sürümünün derlenmesini destekler. Bu, bir Java testi veya uygulama oluştururken tüm bağımlılıkların aynı Java sürümüne göre geliştirildiği anlamına gelir.
Ancak ayrı derlemeler farklı bayraklar kullanılarak yürütülebilir.
Farklı flag'ler kullanma işini kolaylaştırmak için belirli bir sürüme ait işaret grupları .bazelrc
yapılandırmalarıyla gruplanabilir":
build:java8 --java_language_version=8
build:java8 --java_runtime_version=local_jdk_8
build:java11 --java_language_version=11
build:java11 --java_runtime_version=remotejdk_11
Bu yapılandırmalar --config
işaretiyle kullanılabilir (örneğin, bazel test --config=java11 //:java11_test
).