Trang này chứa các tài nguyên giúp bạn sử dụng Bazel với các dự án Java. Nó liên kết đến hướng dẫn, quy tắc xây dựng và thông tin khác cụ thể về việc xây dựng Các dự án Java dùng Bazel.
Làm việc với Bazel
Các tài nguyên sau sẽ giúp bạn xử lý Bazel trong các dự án Java:
Di chuyển sang Bazel
Nếu bạn đang xây dựng các dự án Java bằng Maven, hãy làm theo các bước trong hướng dẫn di chuyển để bắt đầu tạo dự án Maven bằng Bazel:
Phiên bản Java
Có hai phiên bản Java có liên quan được đặt với cờ cấu hình:
- phiên bản của các tệp nguồn trong kho lưu trữ
- phiên bản thời gian chạy Java dùng để thực thi mã và kiểm thử nó
Định cấu hình phiên bản mã nguồn trong kho lưu trữ của bạn
Nếu không có cấu hình bổ sung, Bazel giả định tất cả các tệp nguồn Java trong
kho lưu trữ được viết bằng một phiên bản Java duy nhất. Để chỉ định phiên bản của
các nguồn trong kho lưu trữ, hãy thêm build --java_language_version={ver}
vào
.bazelrc
, trong đó {ver}
là ví dụ 11
. Chủ sở hữu kho lưu trữ Bazel
đặt cờ này để Bazel và người dùng có thể tham chiếu mã
Số phiên bản Java. Để biết thêm thông tin, hãy xem
Cờ phiên bản ngôn ngữ Java.
Định cấu hình JVM dùng để thực thi và kiểm thử mã
Bazel sử dụng một JDK để biên dịch và một JVM khác để thực thi và kiểm thử mã.
Theo mặc định, Bazel biên dịch mã bằng cách sử dụng JDK, nó tải xuống rồi thực thi và
kiểm thử mã bằng JVM được cài đặt trên máy cục bộ. Bazel tìm kiếm
JVM bằng JAVA_HOME
hoặc đường dẫn.
Các tệp nhị phân thu được tương thích với JVM được cài đặt cục bộ trong hệ thống thư viện, tức là các tệp nhị phân thu được phụ thuộc vào những gì được cài đặt trên máy.
Để định cấu hình JVM dùng để thực thi và kiểm thử, hãy sử dụng --java_runtime_version
cờ. Giá trị mặc định là local_jdk
.
Kiểm thử và biên dịch tích hợp
Để tạo biên dịch ẩn, bạn có thể sử dụng cờ hiệu dòng lệnh
--java_runtime_version=remotejdk_11
. Mã này được biên dịch, thực thi và
đã kiểm thử trên JVM được tải xuống từ một kho lưu trữ từ xa. Để biết thêm thông tin, hãy xem
Cờ phiên bản thời gian chạy Java.
Định cấu hình biên dịch và thực thi công cụ xây dựng trong Java
Có một cặp JDK và JVM thứ hai dùng để xây dựng và thực thi các công cụ, đó là
được dùng trong quá trình tạo bản dựng, nhưng không có trong kết quả bản dựng. JDK và JVM đó
được kiểm soát bằng --tool_java_language_version
và
--tool_java_runtime_version
. Giá trị mặc định là 11
và remotejdk_11
,
.
Biên dịch bằng JDK được cài đặt cục bộ
Theo mặc định, Bazel biên dịch bằng JDK từ xa, vì nó đang ghi đè JDK nội bộ. Các chuỗi công cụ biên dịch sử dụng JDK được cài đặt cục bộ sẽ được định cấu hình, nhưng không được sử dụng.
Để biên dịch bằng JDK được cài đặt cục bộ, hãy dùng chuỗi công cụ biên dịch
đối với JDK cục bộ, hãy sử dụng cờ bổ sung --extra_toolchains=@local_jdk//:all
,
tuy nhiên, xin lưu ý rằng thao tác này có thể không hoạt động trên JDK của các nhà cung cấp tuỳ ý.
Để biết thêm thông tin, hãy xem định cấu hình chuỗi công cụ Java.
Các phương pháp hay nhất
Ngoài các phương pháp hay nhất chung cho Bazel, dưới đây là dành riêng cho dự án Java.
Cấu trúc thư mục
Ưu tiên bố cục thư mục chuẩn của Maven (các nguồn trong src/main/java
, các hoạt động kiểm thử
dưới src/test/java
).
XÂY DỰNG tệp
Hãy tuân theo các nguyên tắc sau khi tạo tệp BUILD
:
Sử dụng một tệp
BUILD
cho mỗi thư mục chứa các nguồn Java vì điều này cải thiện hiệu suất của bản dựng.Mỗi tệp
BUILD
phải chứa một quy tắcjava_library
có dạng như sau sau:java_library( name = "directory-name", srcs = glob(["*.java"]), deps = [...], )
Tên thư viện phải là tên của thư mục chứa Tệp
BUILD
. Thao tác này làm cho nhãn của thư viện ngắn hơn, tức là"//package"
thay vì"//package:package"
.Các nguồn phải là
glob
không đệ quy của tất cả tệp Java trong thư mục.Các bài kiểm thử phải nằm trong một thư mục phù hợp trong
src/test
và phụ thuộc vào điều này thư viện của bạn.
Tạo quy tắc mới cho các bản dựng Java nâng cao
Lưu ý: Việc tạo quy tắc mới là dành cho các tình huống kiểm thử và bản dựng nâng cao. Bạn không cần thiết khi bắt đầu sử dụng Bazel.
Các mô-đun, mảnh cấu hình và nhà cung cấp sau đây sẽ giúp bạn mở rộng khả năng của Bazel khi tạo Java dự án:
- Mô-đun Java chính:
java_common
- Nhà cung cấp Java chính:
JavaInfo
- Mảnh cấu hình:
java
Các mô-đun khác:
Định cấu hình chuỗi công cụ Java
Bazel sử dụng hai loại chuỗi công cụ Java:
– việc thực thi, được dùng để thực thi và kiểm thử các tệp nhị phân Java, được kiểm soát bằng
Cờ --java_runtime_version
– biên dịch, dùng để biên dịch các nguồn Java, được kiểm soát bằng
Cờ --java_language_version
Định cấu hình chuỗi công cụ thực thi bổ sung
Chuỗi công cụ thực thi là JVM, cục bộ hoặc từ một kho lưu trữ, với một số thông tin bổ sung về phiên bản, hệ điều hành và CPU của ứng dụng cấu trúc.
Bạn có thể thêm chuỗi công cụ thực thi Java bằng cách sử dụng local_java_repository
hoặc
remote_java_repository
quy tắc trong tệp WORKSPACE
. Việc thêm quy tắc giúp
JVM có sẵn bằng cách sử dụng cờ. Trường hợp có nhiều định nghĩa cho cùng một hoạt động
hệ thống và cấu trúc CPU đã được cung cấp, cấu trúc đầu tiên được sử dụng.
Cấu hình mẫu của JVM cục bộ:
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
)
Cấu hình mẫu của JVM từ xa:
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 = ...
)
Định cấu hình chuỗi công cụ biên dịch bổ sung
Chuỗi công cụ biên dịch bao gồm JDK và nhiều công cụ mà Bazel sử dụng trong quá trình biên dịch và cung cấp các tính năng bổ sung, chẳng hạn như: Lỗi Nằm thẳng, các phần phụ thuộc Java nghiêm ngặt, biên dịch tiêu đề, đơn giản hoá Android, khả năng đo lường mức độ sử dụng và xử lý genclass cho IDE.
JavaBuilder là một công cụ theo gói Bazel có khả năng thực thi quá trình biên dịch và cung cấp
các tính năng nêu trên. Quá trình biên dịch thực tế được thực thi bằng phương thức nội bộ
bằng JDK. JDK dùng để biên dịch được java_runtime
chỉ định
của chuỗi công cụ.
Bazel ghi đè một số thành phần JDK bên trong. Trong trường hợp phiên bản JDK > 9,
Các mô-đun java.compiler
và jdk.compiler
được vá bằng cờ của JDK
--patch_module
. Trong trường hợp JDK 8, trình biên dịch Java được vá bằng
Cờ -Xbootclasspath
.
VanillaJavaBuilder là triển khai thứ hai của JavaBuilder, không sửa đổi trình biên dịch nội bộ của JDK và không có bất kỳ các tính năng bổ sung. VanillaJavaBuilder không được bất kỳ trình tạo mã tích hợp nào sử dụng chuỗi công cụ.
Ngoài JavaBuilder, Bazel còn sử dụng một số công cụ khác trong quá trình biên dịch.
Công cụ ijar
xử lý jar
tệp để xoá mọi thứ, ngoại trừ lệnh gọi
chữ ký. Các ngăn kết quả được gọi là ngăn chứa tiêu đề. Chúng được dùng để cải thiện
mức độ gia tăng biên dịch bằng cách chỉ biên dịch lại các phần phụ thuộc ở hạ nguồn khi
phần nội dung của hàm sẽ thay đổi.
Công cụ singlejar
nhóm nhiều tệp jar
lại với nhau thành một.
Công cụ genclass
xử lý kết quả của quá trình biên dịch Java và tạo ra
một jar
chỉ chứa các tệp lớp của các nguồn do
trình xử lý chú giải.
Công cụ JacocoRunner
chạy Jacoco trên các tệp được đo lường và xuất ra kết quả
Định dạng LCOV.
Công cụ TestRunner
thực thi chương trình kiểm thử JUnit 4 trong một môi trường được kiểm soát.
Bạn có thể định cấu hình lại quá trình biên dịch bằng cách thêm macro default_java_toolchain
vào
tệp BUILD
và đăng ký tệp này bằng cách thêm quy tắc register_toolchains
vào
tệp WORKSPACE
hoặc bằng cách sử dụng
Cờ --extra_toolchains
.
Chuỗi công cụ chỉ được sử dụng khi thuộc tính source_version
khớp với
giá trị do cờ --java_language_version
chỉ định.
Ví dụ về cấu hình chuỗi công cụ:
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",
)
có thể được sử dụng bằng --extra_toolchains=//:repository_default_toolchain_definition
hoặc bằng cách thêm register_toolchains("//:repository_default_toolchain_definition")
cho không gian làm việc.
Cấu hình định sẵn:
DEFAULT_TOOLCHAIN_CONFIGURATION
: tất cả các tính năng, hỗ trợ các phiên bản JDK >= 9VANILLA_TOOLCHAIN_CONFIGURATION
: không có tính năng bổ sung, hỗ trợ JDK của nhà cung cấp tuỳ ý.PREBUILT_TOOLCHAIN_CONFIGURATION
: giống như mặc định, nhưng chỉ dùng định dạng tạo sẵn công cụ (ijar
,singlejar
)NONPREBUILT_TOOLCHAIN_CONFIGURATION
: giống như mặc định, nhưng tất cả công cụ đều được tạo từ các nguồn (điều này có thể hữu ích trên hệ điều hành có libc)
Định cấu hình cờ trình biên dịch JVM và Java
Bạn có thể định cấu hình cờ JVM và javac bằng cờ hoặc bằng
Thuộc tính default_java_toolchain
.
Cờ có liên quan là --jvmopt
, --host_jvmopt
, --javacopt
và
--host_javacopt
.
Các thuộc tính default_java_toolchain
có liên quan là javacopts
, jvm_opts
,
javabuilder_jvm_opts
và turbine_jvm_opts
.
Cấu hình cờ của trình biên dịch Java cụ thể trong gói
Bạn có thể định cấu hình các cờ trình biên dịch Java khác nhau cho nguồn cụ thể
bằng thuộc tính package_configuration
của default_java_toolchain
.
Vui lòng tham khảo ví dụ bên dưới.
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
],
)
Nhiều phiên bản mã nguồn Java trong một kho lưu trữ
Bazel chỉ hỗ trợ biên dịch một phiên bản nguồn Java duy nhất trong một bản dựng. bản dựng. Điều này có nghĩa là khi tạo kiểm thử Java hoặc ứng dụng, tất cả các phần phụ thuộc được tạo dựa trên cùng một phiên bản Java.
Tuy nhiên, các bản dựng riêng biệt có thể được thực thi bằng các cờ khác nhau.
Để thực hiện tác vụ sử dụng các cờ khác nhau dễ dàng hơn, hãy đặt các cờ cho một
phiên bản có thể được nhóm với .bazelrc
cấu hình":
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
Ví dụ: có thể sử dụng các cấu hình này với cờ --config
bazel test --config=java11 //:java11_test
.