이 페이지에서는 Maven에서 Bazel로 이전하는 방법을 설명합니다. 여기에는 기본 요건과 설치 단계가 포함됩니다. Maven과 Bazel의 차이점을 설명하고 Guava 프로젝트를 사용하는 이전 예를 제공합니다.
빌드 도구에서 Bazel로 이전할 때는 개발팀, CI 시스템, 기타 관련 시스템을 완전히 이전할 때까지 두 빌드 도구를 동시에 실행하는 것이 좋습니다. 동일한 저장소에서 Maven과 Bazel을 실행할 수 있습니다.
rules_jvm_external Maven 호환성 레이어가 없으므로 Maven 플러그인을 Bazel에서 직접 실행할 수 없습니다.시작하기 전에
- Bazel이 아직 설치되어 있지 않으면 설치합니다.
- Bazel을 처음 사용하는 경우 이전을 시작하기 전에 튜토리얼 Bazel 소개: Java 빌드를 살펴보세요. 이 튜토리얼에서는 Bazel의 개념, 구조, 라벨 구문을 설명합니다.
Maven과 Bazel의 차이점
- Maven은 최상위
pom.xml파일을 사용합니다. Bazel은 여러 빌드 파일과BUILD파일당 여러 타겟을 지원하므로 빌드가 Maven보다 증분식으로 가능합니다. - Maven은 배포 프로세스의 단계를 담당합니다. Bazel은 배포를 자동화하지 않습니다.
- Bazel을 사용하면 언어 간의 종속 항목을 표현할 수 있습니다.
- 프로젝트에 새 섹션을 추가할 때 Bazel을 사용하면 새
BUILD파일을 추가해야 할 수 있습니다. 각 새 Java 패키지에BUILD파일을 추가하는 것이 좋습니다.
Maven에서 Bazel로 이전
아래 단계에서는 프로젝트를 Bazel로 이전하는 방법을 설명합니다.
아래 예는 Maven에서 Bazel로
Guava 프로젝트를 이전한 것입니다.
사용된 Guava 프로젝트는 v31.1 버전입니다. Guava를 사용하는 예는 이전의 각 단계를 안내하지는 않지만 이전을 위해 생성되거나 수동으로 추가되는 파일과 콘텐츠를 보여줍니다.
$ git clone https://github.com/google/guava.git && cd guava
$ git checkout v31.1
1. WORKSPACE 파일 만들기
프로젝트의 루트에 WORKSPACE라는 파일을 만듭니다. 프로젝트에 외부 종속 항목이 없으면 작업공간 파일이 비어 있을 수 있습니다.
프로젝트가 프로젝트 디렉터리 중 하나에 없는 파일 또는 패키지에 종속된 경우 작업공간
파일에서 이러한 외부 종속 항목을 지정합니다. 작업공간 파일의 외부 종속 항목 목록을 자동화하려면
rules_jvm_external을 사용합니다. 이 규칙 집합 사용에 관한 안내는
리드미를 참고하세요.
Guava 프로젝트 예: 외부 종속 항목
Guava 프로젝트의 외부 종속 항목을
rules_jvm_external
규칙 집합을 사용하여 나열할 수 있습니다.
WORKSPACE 파일에 다음 스니펫을 추가합니다.
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
RULES_JVM_EXTERNAL_TAG = "4.3"
RULES_JVM_EXTERNAL_SHA = "6274687f6fc5783b589f56a2f1ed60de3ce1f99bc4e8f9edef3de43bdf7c6e74"
http_archive(
name = "rules_jvm_external",
sha256 = RULES_JVM_EXTERNAL_SHA,
strip_prefix = "rules_jvm_external-%s" % RULES_JVM_EXTERNAL_TAG,
url = "https://github.com/bazelbuild/rules_jvm_external/archive/%s.zip" % RULES_JVM_EXTERNAL_TAG,
)
load("@rules_jvm_external//:defs.bzl", "maven_install")
maven_install(
artifacts = [
"com.google.code.findbugs:jsr305:3.0.2",
"com.google.errorprone:error_prone_annotations:2.11.0",
"com.google.j2objc:j2objc-annotations:1.3",
"org.codehaus.mojo:animal-sniffer-annotations:1.20",
"org.checkerframework:checker-qual:3.12.0",
],
repositories = [
"https://repo1.maven.org/maven2",
],
)
2. BUILD 파일 하나 만들기
이제 작업공간이 정의되고 외부 종속 항목 (해당하는 경우)이 나열되었으므로 프로젝트를 빌드하는 방법을 설명하는 BUILD 파일을 만들어야 합니다. pom.xml 파일이 하나인 Maven과 달리 Bazel은 여러
BUILD 파일을 사용하여 프로젝트를 빌드할 수 있습니다. 이러한 파일은 여러 빌드 타겟을 지정하므로
Bazel은 증분식 빌드를 생성할 수 있습니다.
단계별로 BUILD 파일을 추가합니다. 프로젝트의 루트에 BUILD 파일을 하나 추가하고 이를 사용하여 Bazel을 사용하여 초기 빌드를 실행합니다.
그런 다음 더 세분화된
타겟으로 BUILD 파일을 더 추가하여 빌드를 세부적으로 조정합니다.
WORKSPACE파일과 동일한 디렉터리에 텍스트 파일을 만들고 이름을BUILD로 지정합니다.이
BUILD파일에서 적절한 규칙을 사용하여 프로젝트를 빌드할 타겟 하나를 만듭니다. 이때 다음 도움말을 참고하세요.적절한 규칙을 사용합니다.
단일 Maven 모듈로 프로젝트를 빌드하려면 다음과 같이
java_library규칙을 사용합니다.java_library( name = "everything", srcs = glob(["src/main/java/**/*.java"]), resources = glob(["src/main/resources/**"]), deps = ["//:all-external-targets"], )여러 Maven 모듈로 프로젝트를 빌드하려면 다음과 같이
java_library규칙을 사용합니다.java_library( name = "everything", srcs = glob([ "Module1/src/main/java/**/*.java", "Module2/src/main/java/**/*.java", ... ]), resources = glob([ "Module1/src/main/resources/**", "Module2/src/main/resources/**", ... ]), deps = ["//:all-external-targets"], )바이너리를 빌드하려면
java_binary규칙을 사용합니다.java_binary( name = "everything", srcs = glob(["src/main/java/**/*.java"]), resources = glob(["src/main/resources/**"]), deps = ["//:all-external-targets"], main_class = "com.example.Main" )
속성을 지정합니다.
name: 타겟에 의미 있는 이름을 지정합니다. 위의 예에서 타겟은 'everything'이라고 합니다.srcs: globbing을 사용하여 프로젝트의 모든 .java 파일을 나열합니다.resources: globbing을 사용하여 프로젝트의 모든 리소스를 나열합니다.deps: 프로젝트에 필요한 외부 종속 항목을 결정해야 합니다. 예를 들어generate_workspace도구를 사용하여 외부 종속 항목 목록을 생성한 경우java_library의 종속 항목은generated_java_libraries매크로에 나열된 라이브러리입니다.
Guava 프로젝트의 이전에서 이 최상위 BUILD 파일의 아래 예를 살펴보세요.
이제 프로젝트의 루트에
BUILD파일이 있으므로 프로젝트를 빌드 하여 작동하는지 확인합니다. 명령줄에서 작업공간 디렉터리에서bazel build //:everything을 사용하여 Bazel로 프로젝트를 빌드합니다.이제 Bazel을 사용하여 프로젝트가 성공적으로 빌드되었습니다. 프로젝트의 증분식 빌드를 허용하려면
BUILD파일을 더 추가해야 합니다.
Guava 프로젝트 예: BUILD 파일 하나로 시작
Guava 프로젝트를 Bazel로 이전할 때 처음에는 BUILD 파일 하나를 사용하여
전체 프로젝트를 빌드합니다. 다음은 작업공간 디렉터리에 있는 이 초기 BUILD
파일의 콘텐츠입니다.
java_library(
name = "everything",
srcs = glob([
"guava/src/**/*.java",
"futures/failureaccess/src/**/*.java",
]),
deps = [
"@maven//:com_google_code_findbugs_jsr305",
"@maven//:com_google_errorprone_error_prone_annotations",
"@maven//:com_google_j2objc_j2objc_annotations",
"@maven//:org_checkerframework_checker_qual",
"@maven//:org_codehaus_mojo_animal_sniffer_annotations",
],
)
3. BUILD 파일 더 만들기 (선택사항)
Bazel은 첫 번째
빌드를 완료한 후 확인한 것처럼 BUILD file 하나로 작동합니다. 하지만 세분화된 타겟으로 BUILD 파일을 더 추가하여
빌드를 더 작은 청크로 나누는 것이 좋습니다.
타겟이 여러 개인 BUILD 파일이 여러 개 있으면 빌드의 세분성이 높아져
다음이 가능합니다.
- 프로젝트의 증분식 빌드 증가,
- 빌드의 병렬 실행 증가,
- 향후 사용자를 위한 빌드의 유지관리 개선,
- 구현 세부정보가 포함된 라이브러리가 공개 API로 유출되는 것과 같은 문제를 방지할 수 있는 패키지 간 타겟의 공개 상태 제어.
파일을 더 추가하기 위한 도움말:BUILD
- 각 Java 패키지에
BUILD파일을 추가하는 것으로 시작할 수 있습니다. 종속 항목이 가장 적은 Java 패키지부터 시작하여 종속 항목이 가장 많은 패키지까지 진행합니다. BUILD파일을 추가하고 타겟을 지정할 때 이러한 새 타겟을 종속된 타겟의deps섹션에 추가합니다.glob()함수는 패키지 경계를 넘지 않으므로 패키지 수가 증가함에 따라glob()에서 일치하는 파일이 줄어듭니다.main디렉터리에BUILD파일을 추가할 때마다 해당test디렉터리에BUILD파일을 추가해야 합니다.- 패키지 간의 공개 상태를 적절히 제한해야 합니다.
BUILD파일 설정의 오류 문제 해결을 간소화하려면 각 빌드 파일을 추가할 때 프로젝트가 Bazel로 계속 빌드되도록 합니다.bazel build //...를 실행하여 모든 타겟이 계속 빌드되는지 확인합니다.
4. Bazel을 사용하여 빌드
빌드 설정을 검증하기 위해 BUILD 파일을 추가할 때 Bazel을 사용하여 빌드했습니다.
원하는 세분성으로 BUILD 파일이 있으면 Bazel
을 사용하여 모든 빌드를 생성할 수 있습니다.