이 페이지에는 Java 프로젝트에서 Bazel을 사용하는 데 도움이 되는 리소스가 포함되어 있습니다. 그것은 빌드 규칙 및 빌드와 관련된 기타 정보에 대한 링크를 Bazel을 사용한 Java 프로젝트
Bazel 사용
다음 리소스는 Java 프로젝트에서 Bazel을 사용하는 데 도움이 됩니다.
Bazel로 마이그레이션
현재 Maven을 사용하여 Java 프로젝트를 빌드하고 있다면 Bazel로 Maven 프로젝트 빌드를 시작하기 위한 이전 가이드:
자바 버전
구성 플래그를 통해 설정되는 두 가지 관련 자바 버전이 있습니다.
- 저장소에 있는 소스 파일의 버전
- 코드를 실행하고 테스트하는 데 사용되는 Java 런타임의 버전 이 항목
저장소의 소스 코드 버전 구성
추가 구성이 없으면 Bazel은 기본 구성 파일의 모든 Java 소스 파일을
단일 Java 버전으로 작성됩니다 새 버전의
저장소의 소스, build --java_language_version={ver}
추가 대상
.bazelrc
파일(여기서 {ver}
의 예: 11
) Bazel 저장소 소유자
Bazel과 사용자가 소스 코드의
Java 버전 번호 자세한 내용은
자바 언어 버전 플래그.
코드 실행 및 테스트에 사용되는 JVM 구성
Bazel은 컴파일에 하나의 JDK를 사용하고 다른 JVM을 사용하여 코드를 실행하고 테스트합니다.
기본적으로 Bazel은 JDK를 사용하여 코드를 컴파일하여 다운로드 및 실행하고
로컬 머신에 설치된 JVM으로 코드를 테스트합니다. Bazel이 검색하는 내용
JAVA_HOME
또는 경로를 사용하여 JVM.
결과 바이너리는 시스템에 로컬로 설치된 JVM과 호환됩니다. 다시 말해, 결과 바이너리가 라이브러리에 설치된 항목에 따라 가상 머신을 만드는 데 도움이 됩니다
실행 및 테스트에 사용되는 JVM을 구성하려면 --java_runtime_version
를 사용하세요.
플래그. 기본값은 local_jdk
입니다.
밀폐 테스트 및 컴파일
밀폐 컴파일을 만들려면 명령줄 플래그를 사용할 수 있습니다.
--java_runtime_version=remotejdk_11
코드가 실행되는 동안
원격 저장소에서 다운로드한 JVM에서 테스트됩니다. 자세한 내용은
자바 런타임 버전 플래그.
Java에서 빌드 도구의 컴파일 및 실행 구성
도구를 빌드하고 실행하는 데 사용되는 두 번째 JDK와 JVM 쌍이 있으며, 이는
빌드 프로세스에서 사용되지만 빌드 결과에는 없습니다. 해당 JDK 및 JVM
--tool_java_language_version
및
--tool_java_runtime_version
입니다. 기본값은 11
및 remotejdk_11
입니다.
각각 1개의 값으로 사용합니다.
로컬로 설치된 JDK를 사용하여 컴파일
Bazel은 기본적으로 원격 JDK를 사용하여 컴파일합니다. JDK의 있습니다. 로컬에 설치된 JDK를 사용하는 컴파일 도구 모음이 구성됩니다. 있습니다.
로컬에 설치된 JDK를 사용하여 컴파일하려면 컴파일 도구 모음을 사용합니다.
로컬 JDK의 경우 추가 플래그 --extra_toolchains=@local_jdk//:all
를 사용합니다.
그러나 임의 공급업체의 JDK에서는 작동하지 않을 수 있습니다.
자세한 내용은 Java 도구 모음 구성을 참조하세요.
권장사항
다음은 일반적인 Bazel 권장사항 외에 다음과 같은 내용입니다. 권장사항도 제공합니다.
디렉터리 구조
Maven의 표준 디렉터리 레이아웃 선호 (src/main/java
아래의 소스, 테스트)
(src/test/java
이하)
BUILD 파일
BUILD
파일을 만들 때 다음 가이드라인을 따르세요.
Java 소스가 포함된 디렉터리당 하나의
BUILD
파일을 사용합니다. 빌드 성능을 개선합니다.모든
BUILD
파일에는 다음과 같은java_library
규칙 1개가 포함되어야 합니다. 다음과 같습니다.java_library( name = "directory-name", srcs = glob(["*.java"]), deps = [...], )
라이브러리 이름은
BUILD
파일. 이렇게 하면 라이브러리의 라벨이 더 짧아집니다."//package:package"
대신"//package"
소스는 다음과 같은 비재귀
glob
여야 합니다. 모든 Java 파일이 포함되어 있습니다테스트는
src/test
의 일치하는 디렉터리에 있어야 하며 있습니다.
고급 Java 빌드를 위한 새 규칙 만들기
참고: 고급 빌드 및 테스트 시나리오를 위한 새 규칙 생성입니다. 필요한 작업: Bazel을 시작할 때는 필요하지 않습니다
다음 모듈, 구성 프래그먼트 및 제공자는 Java 빌드 시 Bazel의 기능 확장 프로젝트:
- 기본 Java 제공자:
java_common
- 기본 Java 모듈:
JavaInfo
- 구성 프래그먼트:
java
기타 모듈:
Java 도구 모음 구성
Bazel은 두 가지 유형의 Java 도구 모음을 사용합니다.
- 다음을 통해 제어되는 Java 바이너리를 실행 및 테스트하는 데 사용되는 실행
--java_runtime_version
플래그
- Java 소스를 컴파일하는 데 사용되며
--java_language_version
플래그
추가 실행 도구 모음 구성
실행 도구 모음은 로컬 또는 저장소에서 가져온 JVM이며, 버전, 운영 체제 및 CPU에 대한 추가 정보를 살펴봤습니다
Java 실행 도구 모음은 local_java_repository
또는
WORKSPACE
파일의 remote_java_repository
규칙 규칙을 추가하면
사용할 수 있는 JVM입니다 동일한 운영 체제에 대한 여러 정의가
CPU 아키텍처가 주어지면 첫 번째 아키텍처가 사용됩니다.
로컬 JVM 구성 예시:
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
)
원격 JVM의 구성 예는 다음과 같습니다.
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 = ...
)
추가 컴파일 도구 모음 구성
컴파일 도구 모음은 JDK와 Bazel이 사용하는 여러 도구로 구성됩니다. 가 컴파일되며 다음과 같은 추가 기능을 제공합니다. 취약하고 엄격한 Java 종속 항목, 헤더 컴파일, Android 디슈가링 커버리지 계측, IDE용 genclass 처리를 살펴봅니다.
JavaBuilder는 컴파일을 실행하는 Bazel 번들 도구이며
사용할 수 있습니다. 실제 컴파일은
컴파일러를 추가합니다. 컴파일에 사용되는 JDK는 java_runtime
에서 지정합니다.
속성 값을 정의합니다.
Bazel이 일부 JDK 내부 요소를 재정의합니다. JDK 버전의 경우 > 9,
java.compiler
및 jdk.compiler
모듈은 JDK의 플래그를 사용하여 패치됩니다.
--patch_module
입니다. JDK 버전 8의 경우 Java 컴파일러는
-Xbootclasspath
플래그.
VanillaJavaBuilder는 JavaBuilder의 두 번째 구현으로 JDK의 내부 컴파일러를 수정하지 않고 추가 기능을 제공합니다 VanillaJavaBuilder는 있습니다.
Bazel은 JavaBuilder 외에도 컴파일하는 동안 다른 여러 도구를 사용합니다.
ijar
도구는 jar
파일을 처리하여 호출을 제외한 모든 파일을 삭제합니다.
서명이 필요합니다 생성되는 jar를 헤더 jar라고 합니다. 이는
다운스트림 종속 항목을 다시 컴파일하면
함수 본문이 변경됩니다.
singlejar
도구는 여러 jar
파일을 단일 파일로 함께 패키징합니다.
genclass
도구는 Java 컴파일의 출력을 후처리하여
생성된 소스의 클래스 파일만 포함하는 jar
주석 프로세서의 한 유형입니다.
JacocoRunner
도구는 계측된 파일에서 Jacoco를 실행하고
LCOV 형식.
TestRunner
도구는 제어된 환경에서 JUnit 4 테스트를 실행합니다.
default_java_toolchain
매크로를 추가하여 컴파일을 재구성할 수 있습니다.
BUILD
파일을 생성하고 여기에 register_toolchains
규칙을 추가하여
WORKSPACE
파일을 업로드하거나
--extra_toolchains
플래그.
도구 모음은 source_version
속성이
--java_language_version
플래그로 지정된 값입니다.
도구 모음 구성의 예:
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
를 사용하여 사용할 수 있습니다.
또는 register_toolchains("//:repository_default_toolchain_definition")
추가
작업을 할 수 있습니다.
사전 정의된 구성:
DEFAULT_TOOLCHAIN_CONFIGURATION
: 모든 기능, JDK 버전 9 이상 지원VANILLA_TOOLCHAIN_CONFIGURATION
: 추가 기능 없음, 다음의 JDK 지원 지정할 수 있습니다PREBUILT_TOOLCHAIN_CONFIGURATION
: 기본값과 동일하지만 사전 빌드만 사용합니다. 도구 (ijar
,singlejar
)NONPREBUILT_TOOLCHAIN_CONFIGURATION
: 기본값과 동일하지만 모든 도구가 (이것은 다양한 소스 유형이 있는 운영 체제에서 유용할 수 있음) libc).
JVM 및 Java 컴파일러 플래그 구성
JVM 및 javac 플래그는 플래그 또는
default_java_toolchain
속성
관련 플래그는 --jvmopt
, --host_jvmopt
, --javacopt
및
--host_javacopt
입니다.
관련 default_java_toolchain
속성은 javacopts
, jvm_opts
,
javabuilder_jvm_opts
, turbine_jvm_opts
패키지별 Java 컴파일러 플래그 구성
특정 소스에 서로 다른 Java 컴파일러 플래그를 구성할 수 있습니다.
파일(default_java_toolchain
의 package_configuration
속성 사용)
아래 예를 참고하세요.
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
],
)
단일 저장소에 있는 여러 버전의 자바 소스 코드
Bazel은 빌드에서 단일 버전의 Java 소스 컴파일만 지원합니다. 있습니다. 즉, Java 테스트나 애플리케이션을 빌드할 때 같은 Java 버전에 대해 빌드됩니다
그러나 서로 다른 플래그를 사용하여 별도의 빌드를 실행할 수도 있습니다.
다양한 플래그를 더 쉽게 사용할 수 있도록
버전 .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
이러한 구성은 --config
플래그와 함께 사용할 수 있습니다. 예를 들면 다음과 같습니다.
bazel test --config=java11 //:java11_test
입니다.