Java ve Bazel

Sorun bildirme Kaynağı görüntüleme Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

Bu sayfada, Bazel'i Java projeleriyle kullanmanıza yardımcı olacak kaynaklar yer alır. 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çme

Ş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

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 yüklenen öğelere 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 yürütmek 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 bir java_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. Bu durumda, "//package:package" yerine "//package" kullanılır.

  • Kaynaklar, dizindeki tüm Java dosyalarının yinelemeli olmayan 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 özelliklerini genişletmenize yardımcı olur:

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 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, WORKSPACE dosyasında local_java_repository veya remote_java_repository 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("@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'nin örnek 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'den ve Bazel'in derleme sırasında kullandığı ve ek özellikler sağlayan birden fazla araçtan oluşur. Bu özellikler arasında hatalara yatkınlı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 yer alır.

JavaBuilder, derlemeyi yürüten ve yukarıda belirtilen özellikleri sağlayan, Bazel ile paketlenmiş 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 özelliklerini 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 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ç takımlarından 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ı 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ı, 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.

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şaretçisi 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, JDK sürümleri 9 ve üzerini destekler
  • VANILLA_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 derlenmiştir (bu, farklı libc'ye sahip işletim sistemlerinde faydalı 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.

İ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 bayrakları 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 Java kaynak kodunun birden çok sürümü

Bazel, bir derlemede Java kaynaklarının yalnızca tek bir sürümünün derlenmesini destekler. Bu, bir Java testi veya uygulaması oluştururken tüm bağımlıları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ş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=localjdk_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).