Laman ini berisi sumber daya yang membantu Anda menggunakan Bazel dengan proyek Java. Ini tautan ke tutorial, aturan pembangunan, dan informasi lain yang khusus untuk proyek Java dengan Bazel.
Bekerja dengan Bazel
Sumber daya berikut akan membantu Anda bekerja dengan Bazel pada proyek Java:
Bermigrasi ke Bazel
Jika saat ini Anda membangun project Java dengan Maven, ikuti langkah-langkah di panduan migrasi untuk mulai membangun project Maven Anda dengan Bazel:
Versi Java
Ada dua versi Java yang relevan yang ditetapkan dengan tanda konfigurasi:
- versi file sumber di repositori
- versi waktu proses Java yang digunakan untuk mengeksekusi kode dan menguji ini
Mengonfigurasi versi kode sumber di repositori Anda
Tanpa konfigurasi tambahan, Bazel mengasumsikan semua file sumber Java di
repositori ditulis dalam satu versi Java. Untuk menentukan versi
sumber dalam repositori tambahkan build --java_language_version={ver}
ke
File .bazelrc
, dengan {ver}
sebagai contoh 11
. Pemilik repositori Bazel
harus menyetel penanda ini agar Bazel dan penggunanya
dapat merujuk ke nama penanda
Nomor versi Java. Untuk detail selengkapnya, lihat
Flag versi bahasa Java.
Mengonfigurasi JVM yang digunakan untuk mengeksekusi dan menguji kode
Bazel menggunakan satu JDK untuk kompilasi dan JVM lainnya untuk menjalankan dan menguji kode.
Secara {i>default<i} Bazel mengkompilasi kode menggunakan JDK
yang diunduh dan dieksekusi dan
menguji kode dengan JVM yang
terinstal di komputer lokal. Bazel mencari
JVM menggunakan JAVA_HOME
atau jalur.
Biner yang dihasilkan kompatibel dengan JVM yang diinstal secara lokal di sistem yang berarti biner yang dihasilkan bergantung pada apa yang diinstal pada mesin Linux dan Windows.
Untuk mengonfigurasi JVM yang digunakan untuk eksekusi dan pengujian, gunakan --java_runtime_version
penanda. Nilai defaultnya adalah local_jdk
.
Pengujian dan kompilasi Hermetik
Untuk membuat kompilasi hermetic, Anda dapat menggunakan flag command line
--java_runtime_version=remotejdk_11
. Kode tersebut dikompilasi, dieksekusi, dan
diuji pada JVM
yang diunduh dari repositori jarak jauh. Untuk detail selengkapnya, lihat
Tanda versi runtime Java.
Mengonfigurasi kompilasi dan eksekusi alat build di Java
Ada sepasang JDK dan JVM kedua yang digunakan
untuk membangun dan mengeksekusi alat, yaitu
yang digunakan dalam proses build, tetapi tidak pada hasil build. JDK dan JVM tersebut
dikontrol menggunakan --tool_java_language_version
dan
--tool_java_runtime_version
. Nilai defaultnya adalah 11
dan remotejdk_11
,
secara berurutan.
Mengompilasi menggunakan JDK yang diinstal secara lokal
Bazel secara default mengompilasi menggunakan JDK jarak jauh, karena ia mengganti konfigurasi JDK internal. Toolchain kompilasi yang menggunakan JDK yang diinstal secara lokal dikonfigurasi, tetapi tidak digunakan.
Untuk mengompilasi menggunakan JDK yang diinstal secara lokal, yang menggunakan toolchain kompilasi
untuk JDK lokal, gunakan flag tambahan --extra_toolchains=@local_jdk//:all
,
namun, ingatlah bahwa ini mungkin tidak berfungsi pada JDK dari vendor arbitrer.
Untuk detail selengkapnya, lihat mengonfigurasi toolchain Java.
Praktik terbaik
Selain praktik terbaik umum Bazel, berikut adalah praktik terbaik khusus untuk project Java.
Struktur direktori
Pilih tata letak direktori standar Maven (sumber di bawah src/main/java
, pengujian
di bawah src/test/java
).
BUILD file
Ikuti panduan ini saat membuat file BUILD
:
Gunakan satu file
BUILD
per direktori yang berisi sumber Java, karena ini meningkatkan performa build.Setiap file
BUILD
harus berisi satu aturanjava_library
yang terlihat seperti ini:java_library( name = "directory-name", srcs = glob(["*.java"]), deps = [...], )
Nama library harus berupa nama direktori yang berisi library File
BUILD
. Hal ini membuat label {i>library<i} lebih pendek, yang menggunakan"//package"
, bukan"//package:package"
.Sumber harus berupa
glob
non-rekursif semua file Java dalam direktori.Pengujian harus berada dalam direktori yang cocok dalam
src/test
dan bergantung pada hal ini library.
Membuat aturan baru untuk build Java lanjutan
Catatan: Pembuatan aturan baru ditujukan untuk skenario build dan pengujian lanjutan. Anda tidak memerlukannya saat mulai menggunakan Bazel.
Modul, fragmen konfigurasi, dan penyedia berikut akan membantu Anda meningkatkan kemampuan Bazel saat membangun Java project:
- Penyedia Java utama:
java_common
- Modul Java utama:
JavaInfo
- Fragmen konfigurasi:
java
Modul lainnya:
Mengonfigurasi toolchain Java
Bazel menggunakan dua jenis toolchain Java:
- eksekusi, digunakan untuk mengeksekusi dan menguji biner Java, dikontrol dengan
--java_runtime_version
tanda
- kompilasi, digunakan untuk mengompilasi sumber Java, dikontrol dengan
tanda --java_language_version
Mengonfigurasi toolchain eksekusi tambahan
Toolchain eksekusi adalah JVM, baik lokal maupun dari repositori, dengan beberapa informasi tambahan tentang versi, sistem operasi, dan CPU-nya tentang arsitektur ini.
Toolchain eksekusi Java dapat ditambahkan menggunakan local_java_repository
atau
remote_java_repository
aturan dalam file WORKSPACE
. Menambahkan aturan akan membuat
JVM yang tersedia
menggunakan penanda. Ketika beberapa definisi untuk operasi yang sama
sistem dan arsitektur CPU, yang pertama digunakan.
Contoh konfigurasi JVM lokal:
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
)
Contoh konfigurasi JVM jarak jauh:
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 = ...
)
Mengonfigurasi toolchain kompilasi tambahan
Toolchain kompilasi terdiri dari JDK dan beberapa alat yang digunakan Bazel selama kompilasi dan yang menyediakan fitur tambahan, seperti: Error Prone, dependensi Java yang ketat, kompilasi header, desugaring Android, instrumentasi cakupan, dan penanganan genclass untuk IDE.
JavaBuilder adalah alat paket Bazel yang menjalankan kompilasi, dan menyediakan
fitur-fitur tersebut. Kompilasi sebenarnya dieksekusi menggunakan
oleh JDK. JDK yang digunakan untuk kompilasi ditentukan oleh java_runtime
toolchain tersebut.
Bazel mengganti beberapa internal JDK. Dalam hal versi JDK > 9,
Modul java.compiler
dan jdk.compiler
di-patch menggunakan tanda JDK
--patch_module
. Pada JDK versi 8, compiler Java di-patch menggunakan
-Xbootclasspath
.
VanillaJavaBuilder adalah implementasi JavaBuilder kedua, yang tidak memodifikasi compiler internal JDK dan tidak memiliki fitur tambahan. VanillaJavaBuilder tidak digunakan oleh software bawaan toolchain.
Selain JavaBuilder, Bazel menggunakan beberapa alat lain selama kompilasi.
Alat ijar
memproses file jar
untuk menghapus semuanya kecuali panggilan
tanda tangan. Toples yang dihasilkan disebut top jar header. Laporan tersebut digunakan untuk meningkatkan
inkrementalitas kompilasi dengan hanya
mengompilasi ulang dependensi downstream
isi dari suatu fungsi berubah.
Alat singlejar
menggabungkan beberapa file jar
menjadi satu.
Alat genclass
melakukan pascapemrosesan terhadap output kompilasi Java, dan menghasilkan
jar
yang hanya berisi file class untuk sumber yang dibuat oleh
pemroses anotasi.
Alat JacocoRunner
menjalankan Jacoco pada file dan output berinstrumen menghasilkan
Format LCOV.
Alat TestRunner
menjalankan pengujian JUnit 4 dalam lingkungan yang terkontrol.
Anda dapat mengonfigurasi ulang kompilasi dengan menambahkan makro default_java_toolchain
ke
file BUILD
dan mendaftarkannya dengan menambahkan aturan register_toolchains
ke
file WORKSPACE
atau dengan menggunakan
--extra_toolchains
.
Toolchain hanya digunakan jika atribut source_version
cocok dengan
nilai yang ditentukan oleh flag --java_language_version
.
Contoh konfigurasi toolchain:
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",
)
yang dapat digunakan menggunakan --extra_toolchains=//:repository_default_toolchain_definition
atau dengan menambahkan register_toolchains("//:repository_default_toolchain_definition")
ke ruang kerja.
Konfigurasi standar:
DEFAULT_TOOLCHAIN_CONFIGURATION
: semua fitur, mendukung versi JDK >= 9VANILLA_TOOLCHAIN_CONFIGURATION
: tidak ada fitur tambahan, mendukung JDK vendor arbitrer.PREBUILT_TOOLCHAIN_CONFIGURATION
: sama seperti default, tetapi hanya menggunakan bawaan alat (ijar
,singlejar
)NONPREBUILT_TOOLCHAIN_CONFIGURATION
: sama seperti default, tetapi semua alat dibangun dari sumber (ini mungkin berguna pada sistem operasi dengan libc)
Mengonfigurasi flag JVM dan compiler Java
Anda dapat mengonfigurasi flag JVM dan javac baik dengan flag
Atribut default_java_toolchain
.
Tanda yang relevan adalah --jvmopt
, --host_jvmopt
, --javacopt
, dan
--host_javacopt
.
Atribut default_java_toolchain
yang relevan adalah javacopts
, jvm_opts
,
javabuilder_jvm_opts
, dan turbine_jvm_opts
.
Kemas konfigurasi flag compiler Java tertentu
Anda dapat mengonfigurasi tanda compiler Java yang berbeda untuk sumber
file menggunakan atribut package_configuration
dari default_java_toolchain
.
Lihat contoh di bawah.
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
],
)
Beberapa versi kode sumber Java dalam satu repositori
Bazel hanya mendukung kompilasi satu versi sumber Java dalam sebuah build. buat. Artinya, saat membangun pengujian Java atau aplikasi, semua dependensi dibangun terhadap versi Java yang sama.
Namun, build terpisah dapat dieksekusi menggunakan tanda yang berbeda.
Untuk mempermudah tugas penggunaan penanda yang berbeda, kumpulan penanda untuk
versi dapat dikelompokkan dengan konfigurasi .bazelrc
":
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
Konfigurasi ini dapat digunakan dengan flag --config
, misalnya
bazel test --config=java11 //:java11_test
.