Bu sayfa, Java projeleriyle Bazel'i kullanmanıza yardımcı olacak kaynaklar içerir. Bir eğiticiye, derleme kurallarına ve Bazel ile Java projeleri oluşturmaya özgü 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çiş
Şu anda Java projelerinizi Maven ile derliyorsanız Maven projelerinizi Bazel ile oluşturmaya başlamak için taşıma rehberindeki adımları uygulayın:
Java sürümleri
Java'nın yapılandırma bayraklarıyla ayarlanmış 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ı sürümü
Deponuzdaki kaynak kodu 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. Depodaki kaynakların sürümünü belirtmek için build --java_language_version={ver}
öğesini .bazelrc
dosyasına ekleyin. Burada {ver}
, örneğin 11
değeridir. Bazel deposu sahiplerinin, Bazel ve kullanıcılarının kaynak kodun Java sürüm numarasına başvuruda bulunabilmesi için bu işareti ayarlaması gerekir. 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 başka bir JDK kullanır.
Varsayılan olarak Bazel, kodu indirdiği bir JDK kullanarak derler ve kodu, yerel makinede yüklü JVM ile yürütüp test eder. Bazel, JAVA_HOME
veya yolu kullanarak JVM'yi arar.
Ortaya çıkan ikili programlar, sistem kitaplıklarında yerel olarak yüklenen JVM ile uyumludur. Diğer bir deyişle, elde edilen 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
değeridir.
Hermetik test ve derleme
Hermetik derleme oluşturmak için --java_runtime_version=remotejdk_11
komut satırı işaretini kullanabilirsiniz. Kod, uzak 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şaretini inceleyin.
Java'da derleme araçlarını ve derleme araçlarını yapılandırma
Araçları derleme ve yürütme için kullanılan ikinci bir JDK ve JVM vardır. Bunlar, derleme işleminde kullanılır ancak derleme sonuçlarında yer almaz. JDK ve JVM'nin kontrolü, --tool_java_language_version
ve --tool_java_runtime_version
kullanılarak yapılır. Varsayılan değerler sırasıyla 11
ve remotejdk_11
'dır.
Yerel olarak yüklü JDK kullanarak derleniyor
Bazel, JDK'nın dahili öğelerini geçersiz kıldığı için varsayılan olarak uzak JDK kullanarak derler. Yerel olarak yüklenmiş JDK'yı kullanan derleme araç zincirleri yapılandırılmış olsa da kullanılmaz.
Yerel JDK için derleme araç zincirlerini kullanan, yerel olarak yüklenmiş JDK'yı kullanarak derlemek için ek --extra_toolchains=@local_jdk//:all
işaretini kullanın. Ancak bunun rastgele tedarikçilerin JDK'sında çalışmayabileceğini göz önünde bulundurun.
Daha fazla bilgi 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 yer almaktadır.
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 şu kurallara uyun:
Derleme performansını artırdığından, Java kaynaklarını içeren dizin başına bir
BUILD
dosyası kullanın.Her
BUILD
dosyası, şuna benzer 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, kitaplığın etiketini kısaltır. Bu durumda,"//package:package"
yerine"//package"
kullanılır.Kaynaklar, dizindeki tüm Java dosyalarını içeren, yinelenmeyen bir
glob
olmalıdır.Testler,
src/test
altındaki eşleşen bir dizinde yer alır ve bu kitaplığa bağlı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çindir. Bazel'ı kullanmaya başlarken bu araca 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 becerilerini artırmanıza yardımcı olacaktır:
- 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, yerel veya bir depodan alınan JVM'dir. Bu sanal makinenin sürümü, işletim sistemi ve CPU mimarisi hakkında ek bilgiler bulunur.
Java yürütme araç zincirleri, WORKSPACE
dosyasında local_java_repository
veya remote_java_repository
kuralları kullanılarak eklenebilir. Kuralın eklenmesi, JVM'yi işaret kullanarak kullanılabilir hale getirir. Aynı işletim sistemi ve CPU mimarisi için birden fazla tanım verildiğinde ilki kullanılır.
Yerel JVM yapılandırması için örnek:
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 yapılandırması örneği:
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ç zincirleri yapılandırma
Derleme araç zinciri, JDK'den ve Bazel'in derleme sırasında kullandığı birçok araçtan oluşur. Bu araçlarda şunlar bulunur: Prone, katı Java bağımlılıkları, başlık derleme, Android'de sulama, kapsam enstrümantasyonu ve IDE'ler için genel işleme.
JavaBuilder, derleme yürüten ve yukarıda belirtilen özellikleri sağlayan, Bazel paketine sahip 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ği tarafından belirtilir.
Bazel, bazı JDK dahili değerlerini geçersiz kılar. JDK sürüm 9'dan büyükse 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 derleyiciye -Xbootclasspath
işareti kullanılarak yama uygulanır.
VanillaJavaBuilder, JDK'nın dahili derleyicisinde değişiklik yapmayan ve ek özelliklere sahip olmayan ikinci bir JavaBuilder 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 araçlar da kullanır.
ijar
aracı, çağrı imzaları dışındaki her şeyi kaldırmak için jar
dosyayı işler. Elde edilen kavanozlara başlık jar'ları 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 çok jar
dosyasını tek bir dosyada toplar.
genclass
aracı bir Java derlemesinin çıkışını sonradan işler ve yalnızca ek açıklama işlemcileri tarafından oluşturulan kaynakların sınıf dosyalarını içeren bir jar
üretir.
JacocoRunner
aracı, enstrümanlı dosyalar üzerinde Jacoco'yu çalıştırır ve sonuçları LCOV biçiminde sunar.
TestRunner
aracı, JUnit 4 testlerini kontrollü bir ortamda yürütür.
BUILD
dosyasına default_java_toolchain
makrosu ekleyip 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",
)
--extra_toolchains=//:repository_default_toolchain_definition
veya çalışma alanına register_toolchains("//:repository_default_toolchain_definition")
ekleyerek kullanılabilir.
Önceden tanımlanmış yapılandırmalar:
DEFAULT_TOOLCHAIN_CONFIGURATION
: tüm özellikler, 9 veya sonraki JDK sürümlerini desteklerVANILLA_TOOLCHAIN_CONFIGURATION
: Ek özellik yoktur, isteğe bağlı tedarikçi firmaların JDK'lerini destekler.PREBUILT_TOOLCHAIN_CONFIGURATION
: varsayılanla aynı, ancak yalnızca önceden oluşturulmuş araçları kullan (ijar
,singlejar
)NONPREBUILT_TOOLCHAIN_CONFIGURATION
: varsayılanla aynıdır, ancak tüm araçlar kaynaklardan derlenmiştir (bu, farklı libc'ye sahip işletim sistemlerinde faydalı olabilir)
JVM ve Java derleyici bayraklarını yapılandırma
JVM ve javac flag'lerini, flag'lerle ya da default_java_toolchain
özellikleriyle yapılandırabilirsiniz.
İlgili işaretler: --jvmopt
, --host_jvmopt
, --javacopt
ve --host_javacopt
.
Alakalı default_java_toolchain
özellikleri: javacopts
, jvm_opts
, javabuilder_jvm_opts
ve turbine_jvm_opts
.
Pakete özgü Java derleyici işaretleri yapılandırması
default_java_toolchain
öğesinin package_configuration
özelliğini kullanarak belirli kaynak dosyalar için farklı Java derleyici bayrakları yapılandırabilirsiniz.
Lütfen aşağıdaki örneğe bakın.
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ü derlemeyi destekler. Bu, 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.
Bununla birlikte, ayrı derlemeler farklı işaretler kullanılarak yürütülebilir.
Farklı işaretler kullanma görevini kolaylaştırmak için belirli bir sürüme ait işaret grupları, .bazelrc
yapılandırmalarıyla 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 birlikte kullanılabilir (ör. bazel test --config=java11 //:java11_test
).