Bu sayfa, Java projeleriyle Bazel'i kullanmanıza yardımcı olacak kaynaklar içerir. Google eğitim, yapı kuralları ve uygulama geliştirmeyle ilgili diğer bilgiler Bazel ile Java projeleri.
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 oluşturuyorsanız Bazel ile Maven projelerinizi oluşturmaya başlamak için geçiş rehberi:
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ü o
Deponuzdaki kaynak kodu sürümünü yapılandırma
Ek yapılandırma olmadan, Bazel
tek bir Java sürümünde yazılır. Etiketin sürümünü belirtmek için
depodaki kaynaklara build --java_language_version={ver}
ekle
.bazelrc
dosyası ({ver}
, örneğin 11
değeridir). Bazel deposu sahipleri
bu işareti Bazel ve kullanıcılarının kaynak kodun
Java sürüm numarası. Daha fazla bilgi için bkz.
Java dili sürüm işareti.
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 çalıştırıp
kodu, yerel makinede yüklü JVM ile test eder. Bazel şunları arıyor:
JVM'ye aktarmak için JAVA_HOME
veya yolu kullanın.
Ortaya çıkan ikili programlar, sistemde yerel olarak yüklenmiş JVM ile uyumludur kitaplığına gelir. Bu da sonuçta elde edilen ikili programların üretiliyor.
Yürütme ve test amacıyla kullanılan JVM'yi yapılandırmak için --java_runtime_version
komutunu kullanın.
tıklayın. Varsayılan değer local_jdk
değeridir.
Hermetik test ve derleme
Hermetik derleme oluşturmak için komut satırı işaretini kullanabilirsiniz
--java_runtime_version=remotejdk_11
Kod;
uzaktan depodan indirilen JVM'de test edilmiştir. Daha fazla bilgi için bkz.
Java çalışma zamanı sürüm işareti.
Java'da derleme araçlarını ve derleme araçlarını yapılandırma
Araçları geliştirmek ve yürütmek için kullanılan ikinci bir JDK ve JVM
içinde kullanılır ancak derleme sonuçlarında yer almaz. JDK ve JVM
--tool_java_language_version
ve kullanılarak kontrol edilir
--tool_java_runtime_version
. Varsayılan değerler: 11
ve remotejdk_11
,
tıklayın.
Yerel olarak yüklü JDK kullanarak derleniyor
Bazel varsayılan olarak uzak JDK kullanarak derler, çünkü JDK'nın dahili. Yerel olarak yüklenmiş JDK'yı kullanan derleme araç zincirleri yapılandırıldı. ancak kullanılmaz.
Yerel olarak yüklenmiş JDK ile derleme yapmak için, derleme araç zincirlerini
yerel JDK için --extra_toolchains=@local_jdk//:all
ek işaretini kullanın,
ancak bunun rastgele sağlayıcıların JDK'sında çalışmayabileceğini unutmayın.
Daha fazla bilgi için bkz. Java araç zincirlerini yapılandırma başlıklı makaleyi inceleyin.
En iyi uygulamalar
Bazel ile ilgili genel en iyi uygulamaların yanı sıra aşağıda en iyi uygulamaları paylaşacağım.
Dizin yapısı
Maven'in standart dizin düzenini tercih et (src/main/java
altındaki kaynaklar, testler)
src/test/java
altında).
BUILD dosyaları
BUILD
dosyalarınızı oluştururken şu kurallara uyun:
Java kaynaklarını içeren dizin başına bir
BUILD
dosyası kullanın, çünkü bu derleme performansını iyileştirir.Her
BUILD
dosyası aşağıdaki gibi birjava_library
kuralı içermelidir: bu:java_library( name = "directory-name", srcs = glob(["*.java"]), deps = [...], )
Kitaplığın adı,
BUILD
dosyası yükleyin. Bu da kitaplık etiketini kısaltır."//package:package"
yerine"//package"
.Kaynaklar yinelenmesiz bir
glob
olmalıdır: dizindeki tüm Java dosyalarını içerebilir.Testler,
src/test
altında eşleşen bir dizinde olmalı ve buna bağlı olmalıdır. kitaplığını tanıtı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. Google gerekli değildir.
Aşağıdaki modüller, yapılandırma parçaları ve sağlayıcılar, Java'nızı geliştirirken Bazel'in yeteneklerini artırın projeler:
- 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
- Java kaynaklarını derlemek için kullanılan derleme,
--java_language_version
işareti
Ek yürütme araç zincirlerini yapılandırma
Yürütme araç zinciri, yerel veya depodan gelen JVM'dir ve sürümü, işletim sistemi ve CPU hakkında ek bilgi bahsedeceğim.
Java yürütme araç zincirleri local_java_repository
veya
WORKSPACE
dosyasında remote_java_repository
kural. Kural eklendiğinde
JVM'ye izin verilir. Aynı işletim sistemi için birden fazla tanım
ilki kullanılacak.
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'dan ve Bazel'in kullandığı birçok araçtan oluşur. veya "Hata" gibi ek özellikler sağlayan Yaklaşımlı, katı Java bağımlılıkları, başlık derleme, Android'in sadeleştirmesi, ve IDE'ler için genel sınıf işleme.
JavaBuilder, derlemeyi yürüten ve derlemeyi yürüten Bazel paketine sahip bir araçtır.
özellikler. Gerçek derleme, dahili
derleyicisi olduğunu düşünüyorum. Derleme için kullanılan JDK java_runtime
tarafından belirtilmiştir.
özelliğini gönderin.
Bazel, bazı JDK dahili değerlerini geçersiz kılar. JDK sürümünde > 9,
java.compiler
ve jdk.compiler
modüllerine JDK'nın işareti kullanılarak yama uygulanır
--patch_module
. JDK sürüm 8'de, Java derleyiciye yama
-Xbootclasspath
işareti.
VanillaJavaBuilder, JavaBuilder'ın ikinci bir uygulamasıdır. JDK'nın dahili derleyicisini değiştirmeyen ve sunuyor. VanillaJavaBuilder, yerleşik hiçbir yazılım tarafından kullanılmıyor. araç zincirleri olarak düşünebilirsiniz.
Bazel, derleme sırasında JavaBuilder'a ek olarak başka araçlar da kullanır.
ijar
aracı, çağrı dışındaki her şeyi kaldırmak için jar
dosyayı işler
imzalar. Elde edilen kavanozlara başlık jar'ları denir. Bu grafikler, görsellerin
yalnızca aşağı akış bağımlılarını yeniden derleyerek derleme artımlılığı.
bir fonksiyonun gövdesinin değişmesi.
singlejar
aracı birden çok jar
dosyasını tek bir dosyada toplar.
genclass
aracı bir Java derlemesinin çıkışını işlemden geçirir ve sonuç olarak
Yalnızca tarafından oluşturulan kaynaklara ait sınıf dosyalarını içeren bir jar
ek açıklama işleyicileridir.
JacocoRunner
aracı, enstrümanlı dosyalar üzerinde Jacoco'yu çalıştırır ve sonuçları
LCOV biçimindedir.
TestRunner
aracı, JUnit 4 testlerini kontrollü bir ortamda yürütür.
Şu koleksiyona default_java_toolchain
makrosu ekleyerek derlemeyi yeniden yapılandırabilirsiniz:
bir BUILD
dosyası oluşturur ve bunu register_toolchains
kuralını
WORKSPACE
dosyasını kullanarak veya
--extra_toolchains
işaretini tıklayın.
Araç zinciri yalnızca source_version
özelliği
--java_language_version
işaretiyle belirtilen değer.
Ö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 hesap --extra_toolchains=//:repository_default_toolchain_definition
ile kullanılabilir
veya register_toolchains("//:repository_default_toolchain_definition")
ekleyerek
ilerlemenizi sağlar.
Önceden tanımlanmış yapılandırmalar:
DEFAULT_TOOLCHAIN_CONFIGURATION
: tüm özellikler, 9 veya sonraki JDK sürümlerini desteklerVANILLA_TOOLCHAIN_CONFIGURATION
: Ek özellik yok, şu JDK'leri destekler: rastgele tedarikçiler.PREBUILT_TOOLCHAIN_CONFIGURATION
: varsayılanla aynı, ancak yalnızca önceden oluşturulmuş öğeleri kullan araçlar (ijar
,singlejar
)NONPREBUILT_TOOLCHAIN_CONFIGURATION
: varsayılanla aynıdır, ancak tüm araçlar (bu, farklı özelliklere sahip işletim sistemlerinde yararlı olabilir) libc)
JVM ve Java derleyici bayraklarını yapılandırma
JVM ve javac flag'lerini flag'lerle ya da
default_java_toolchain
özellikleri.
İlgili işaretler --jvmopt
, --host_jvmopt
, --javacopt
ve
--host_javacopt
.
Alakalı default_java_toolchain
özellikleri şunlardır: javacopts
, jvm_opts
,
javabuilder_jvm_opts
ve turbine_jvm_opts
.
Pakete özgü Java derleyici işaretleri yapılandırması
Belirli bir kaynak için farklı Java derleyici bayrakları yapılandırabilirsiniz
default_java_toolchain
öğesinin package_configuration
özelliğini kullanan dosyalar.
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ün derlenmesini destekler. seçeceğiz. Yani, Java testi veya uygulama oluştururken bağımlılıkları aynı Java sürümüne göre derlenmiştir.
Bununla birlikte, ayrı derlemeler farklı işaretler kullanılarak yürütülebilir.
Farklı bayraklar kullanma görevini kolaylaştırmak için, belirli bir
sürümü .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 kullanılabilir. Örneğin
bazel test --config=java11 //:java11_test
.