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