Java ve Bazel

Sorun bildir Kaynağı göster Nightly · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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 taşıma

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 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.

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.

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 Java çalışma zamanı sürümü işareti başlıklı makaleyi inceleyin.

Java'da derleme araçlarını ve derleme araçlarını 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. 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, 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 bkz. 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:

  • 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 bir java_library kuralı içermelidir: bu:

    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 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. 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'nızı geliştirirken Bazel'in yeteneklerini artırın projeler:

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 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, local_java_repository veya Bir modül uzantısında remote_java_repository depo kuralı var. Kural eklendiğinde JVM, bir işaret kullanılarak kullanılabilir hale gelir. 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 kullanım araçları.

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ğiyle belirtilir.

Bazel, bazı JDK dahili özelliklerini 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 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'nın dahili derleyicisini değiştirmeyen ve sunuyor. 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. Elde edilen jar'lara başlık jar'ları 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 çok jar dosyasını tek bir pakette toplar.

genclass aracı, Java derlemesinin çıktısını son işleme tabi tutar ve yalnızca ek açıklama işleyiciler tarafından oluşturulan kaynakların sınıf dosyalarını içeren bir jar oluşturur.

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.

default_java_toolchain makrosu ekleyerek derlemeyi yeniden yapılandırabilirsiniz: bir BUILD dosyası oluşturur ve bunu register_toolchains kuralını MODULE.bazel 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, JDK sürümleri 9 ve üzerini destekler
  • VANILLA_TOOLCHAIN_CONFIGURATION: Ek özellik yok, şu JDK'leri destekler: rastgele oluşturulur.
  • 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 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ı

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. 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.

Bununla birlikte, ayrı derlemeler farklı işaretler kullanılarak 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. Örneğin bazel test --config=java11 //:java11_test.