Bu sayfada, Bazel'i Java projeleriyle kullanmanıza yardımcı olacak kaynaklar yer alır. Bu sayfa, bir eğitime, derleme kurallarına ve Bazel ile Java projeleri oluşturmaya özel diğer bilgilere bağlantı verir.
Bazel ile çalışma
Aşağıdaki kaynaklar, Java projelerinde Bazel ile çalışmanıza yardımcı olur:
Bazel'e geçme
Java projelerinizi şu anda Maven ile derliyorsanız Maven projelerinizi Bazel ile derlemeye başlamak için taşıma rehberindeki adımları uygulayın:
Java sürümleri
Yapılandırıcı işaretlerle ayarlanan Java'nın iki alakalı sürümü vardır:
- Depodaki kaynak dosyaların sürümü
- Kodu çalıştırmak ve test etmek için kullanılan Java çalışma zamanının sürümü
Deponuzdan kaynak kodu sürümünü yapılandırma
Ek yapılandırma olmadan Bazel, depoda bulunan tüm Java kaynak dosyalarının tek bir Java sürümünde yazıldığını varsayar. Depodaki kaynakların sürümünü belirtmek için .bazelrc
dosyasına build --java_language_version={ver}
ekleyin. Burada {ver}
, örneğin 11
olabilir. Bazel deposu sahipleri, Bazel ve kullanıcılarının kaynak kodun Java sürüm numarasına referans vermesi için bu işareti ayarlamalıdır. Daha fazla bilgi için Java dil sürümü işareti başlıklı makaleyi inceleyin.
Kodu yürütmek ve test etmek için kullanılan JVM'yi yapılandırma
Bazel, derleme için bir JDK ve kodu çalıştırıp test etmek için başka bir JVM kullanır.
Bazel, varsayılan olarak kodu indirdiği bir JDK kullanarak derler ve yerel makineye yüklenen JVM ile kodu yürütüp test eder. Bazel, JAVA_HOME
veya yolu kullanarak JVM'yi arar.
Elde edilen ikili programlar, sistem kitaplıklarında yerel olarak yüklü JVM ile uyumludur. Yani elde edilen ikili programlar, makineye nelerin yüklü olduğuna bağlıdır.
Çalıştırma ve test için kullanılan JVM'yi yapılandırmak üzere --java_runtime_version
işaretini kullanın. Varsayılan değer: local_jdk
.
Hermetik test ve derleme
Hermetik derleme oluşturmak için --java_runtime_version=remotejdk_11
komut satırı işaretini kullanabilirsiniz. Kod, uzak bir depodan indirilen JVM için derlenir, yürütülür ve test edilir. Daha fazla bilgi için Java çalışma zamanı sürümü işareti başlıklı makaleyi inceleyin.
Java'da derleme ve derleme araçlarının yürütülmesini yapılandırma
Araçları derlemek ve çalıştırmak için kullanılan ikinci bir JDK ve JVM çifti vardır. Bu çift, derleme sürecinde kullanılır ancak derleme sonuçlarında yer almaz. Bu JDK ve JVM, --tool_java_language_version
ve --tool_java_runtime_version
kullanılarak kontrol edilir. Varsayılan değerler sırasıyla 11
ve remotejdk_11
'tır.
Yerel olarak yüklü JDK'yi kullanarak derleme
Bazel, JDK'nin dahili özelliklerini geçersiz kıldığı için varsayılan olarak uzak JDK'yi kullanarak derleme yapar. Yerel olarak yüklü JDK'yi kullanan derleme araç zincirleri yapılandırılır ancak kullanılmaz.
Yerel olarak yüklü JDK'yi kullanarak derlemek için, yani yerel JDK için derleme araç zincirlerini kullanmak istiyorsanız ek --extra_toolchains=@local_jdk//:all
işaretçisini kullanın. Ancak bu işlemin, rastgele tedarikçi firmaların JDK'lerinde çalışmayabileceğini unutmayın.
Daha fazla bilgi için Java araç zincirlerini yapılandırma başlıklı makaleyi inceleyin.
En iyi uygulamalar
Genel Bazel en iyi uygulamalarına ek olarak, Java projelerine özgü en iyi uygulamalar aşağıda verilmiştir.
Dizin yapısı
Maven'in standart dizin düzenini tercih edin (kaynaklar src/main/java
altında, testler src/test/java
altında).
BUILD dosyaları
BUILD
dosyalarınızı oluştururken aşağıdaki kurallara uyun:
Derleme performansını artırdığı için Java kaynaklarını içeren her dizin için bir
BUILD
dosyası kullanın.Her
BUILD
dosyası şuna benzeyen birjava_library
kuralı içermelidir:java_library( name = "directory-name", srcs = glob(["*.java"]), deps = [...], )
Kitaplığın adı,
BUILD
dosyasını içeren dizinin adıdır. Bu, kitaplığın etiketini kısaltır. Yani"//package:package"
yerine"//package"
kullanın.Kaynaklar, dizindeki tüm Java dosyalarının yinelemeli olmayan bir
glob
olmalıdır.Testler,
src/test
altında eşleşen bir dizinde olmalı ve bu kitaplığa bağlı olmalıdır.
Gelişmiş Java derlemeleri için yeni kurallar oluşturma
Not: Yeni kural oluşturma, gelişmiş derleme ve test senaryoları içindir. 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 genişletmenize yardımcı olur:
- Ana Java modülü:
java_common
- Ana Java sağlayıcı:
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:
- Java ikililerini çalıştırmak ve test etmek için kullanılan yürütme, --java_runtime_version
işaretiyle kontrol edilir
- Java kaynaklarını derlemek için kullanılan derleme, --java_language_version
işaretiyle kontrol edilir
Ek yürütme araç zincirlerini yapılandırma
Yürütme araç zinciri, yerel veya bir depodan gelen JVM'dir. Sürüm, işletim sistemi ve CPU mimarisi hakkında bazı ek bilgiler içerir.
Java yürütme araç zincirleri, bir modül uzantısında local_java_repository
veya remote_java_repository
repo kuralları kullanılarak eklenebilir. Kural eklendiğinde JVM, bir işaret kullanılarak kullanılabilir hale gelir. Aynı işletim sistemi ve CPU mimarisi için birden fazla tanım verildiğinde ilk tanım kullanılır.
Yerel JVM'nin örnek yapılandırması:
load("@rules_java//toolchains: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'nin örnek yapılandırması:
load("@rules_java//toolchains: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'den ve Bazel'in derleme sırasında kullandığı ve aşağıdakiler gibi ek özellikler sunan birden fazla araçtan oluşur: Hataya açık, katı Java bağımlılıkları, başlık derleme, Android'de şekerleme kaldırma, kapsam enstrümantasyonu ve IDE'ler için genclass işleme.
JavaBuilder, derlemeyi yürüten ve yukarıda belirtilen özellikleri sağlayan, Bazel ile birlikte sunulan bir araçtır. Gerçek derleme, JDK tarafından dahili derleyici kullanılarak yürütülür. Derleme için kullanılan JDK, araç zincirinin java_runtime
özelliğiyle belirtilir.
Bazel, bazı JDK dahili özelliklerini geçersiz kılar. JDK sürümü 9'dan büyükse java.compiler
ve jdk.compiler
modülleri, JDK'nin --patch_module
işareti kullanılarak yamalır. JDK 8 sürümü söz konusu olduğunda Java derleyicisi, -Xbootclasspath
işareti kullanılarak yamalı hale getirilir.
VanillaJavaBuilder, JavaBuilder'ın ikinci bir uygulamasıdır. JDK'nin dahili derleyicisinde değişiklik yapmaz ve ek özelliklerden hiçbirine sahip değildir. VanillaJavaBuilder, yerleşik araç zincirlerinden hiçbiri tarafından kullanılmaz.
Bazel, derleme sırasında JavaBuilder'a ek olarak başka araçlar da kullanır.
ijar
aracı, çağrı imzaları dışındaki her şeyi kaldırmak için jar
dosyalarını işler. Ortaya çıkan kavanozlara başlık kavanozu denir. Bunlar, yalnızca bir işlevin gövdesi değiştiğinde alt akıştaki bağımlıları yeniden derleyerek derleme artımlılığını iyileştirmek için kullanılır.
singlejar
aracı, birden fazla jar
dosyasını tek bir dosyada paketler.
genclass
aracı, Java derlemesinin çıktısını son işleme tabi tutar ve yalnızca ek açıklama işleyicileri tarafından oluşturulan kaynakların sınıf dosyalarını içeren bir jar
oluşturur.
JacocoRunner
aracı, Jacoco'yu enstrümante edilmiş dosyalar üzerinde çalıştırır ve sonuçları LCOV biçiminde döndürür.
TestRunner
aracı, JUnit 4 testlerini kontrollü bir ortamda yürütür.
Bir BUILD
dosyasına default_java_toolchain
makrosu ekleyerek ve MODULE.bazel
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şaretçisi tarafından belirtilen değerle eşleştiğinde kullanılır.
Örnek araç zinciri yapılandırması:
load(
"@rules_java//toolchains: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 = "@rules_java//toolchains: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",
)
--extra_toolchains=//:repository_default_toolchain_definition
kullanılarak veya çalışma alanına register_toolchains("//:repository_default_toolchain_definition")
eklenerek kullanılabilir.
Önceden tanımlanmış yapılandırmalar:
DEFAULT_TOOLCHAIN_CONFIGURATION
: tüm özellikler, JDK sürümleri 9 ve üzerini desteklerVANILLA_TOOLCHAIN_CONFIGURATION
: Ek özellik yok, rastgele satıcıların JDK'lerini destekler.PREBUILT_TOOLCHAIN_CONFIGURATION
: Varsayılanla aynıdır ancak yalnızca önceden oluşturulmuş araçlar (ijar
,singlejar
) kullanılır.NONPREBUILT_TOOLCHAIN_CONFIGURATION
: Varsayılanla aynıdır ancak tüm araçlar kaynaklardan derlenir (bu, farklı libc'ye sahip işletim sistemlerinde yararlı olabilir)
JVM ve Java derleyici işaretlerini yapılandırma
JVM ve javac işaretlerini işaretlerle veya default_java_toolchain
özellikleriyle yapılandırabilirsiniz.
İlgili işaretler --jvmopt
, --host_jvmopt
, --javacopt
ve --host_javacopt
'dır.
İlgili default_java_toolchain
özellikleri javacopts
, jvm_opts
, javabuilder_jvm_opts
ve turbine_jvm_opts
'tir.
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("@rules_java//toolchains: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 Java kaynak kodunun birden çok 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 uygulaması oluştururken tüm bağımlılıkların aynı Java sürümüne göre oluşturulduğu anlamına gelir.
Ancak farklı işaretler kullanılarak ayrı derlemeler yürütülebilir.
Farklı işaretleri kullanma görevini kolaylaştırmak için belirli bir sürüme ait işaret grupları .bazelrc
yapılandırmaları" ile gruplandırılabilir:
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 (ör. bazel test --config=java11 //:java11_test
).