이 페이지에서는 Maven에서 Bazel로 마이그레이션하는 방법을 설명합니다. 기본 요건 및 설치 단계를 완료합니다. 이는 Kubernetes와 하고, Guava 프로젝트
빌드 도구에서 Bazel로 마이그레이션할 때는 빌드와 개발팀을 완전히 마이그레이션할 때까지 여러 도구를 동시에 실행하고, CI 시스템 및 기타 관련 시스템을 사용할 수 있습니다. Maven 및 Bazel은 생성할 수 있습니다
시작하기 전에
- 아직 설치되지 않은 경우 Bazel을 설치합니다.
- Bazel을 처음 사용하는 경우 튜토리얼을 진행합니다. 시작하기 전에 Bazel 소개: Java 빌드 마이그레이션합니다. 이 가이드에서는 Bazel의 개념, 구조, 라벨을 설명합니다. 구문을 사용합니다
Maven과 Bazel의 차이점
- Maven에서는 최상위 수준의
pom.xml
파일을 사용합니다. Bazel에서 여러 빌드 지원BUILD
파일당 여러 개의 타겟이 있어 Maven보다 더 증분식입니다 - Maven이 배포 프로세스의 단계를 담당합니다. Bazel이 하는 일 자동화하지 않습니다
- Bazel을 사용하면 언어 간 종속 항목을 표현할 수 있습니다.
- Bazel을 사용하면 프로젝트에 새 섹션을 추가할 때
BUILD
파일. 권장사항은 각각의 새 자바 패키지에BUILD
파일을 추가하는 것입니다.
Maven에서 Bazel로 마이그레이션
아래 단계에서는 프로젝트를 Bazel로 마이그레이션하는 방법을 설명합니다.
아래 예는
Guava 프로젝트(Maven에서 Bazel로 변경)
사용된 Guava 프로젝트는 v31.1
릴리스입니다. Guava를 사용한 예시는
마이그레이션의 각 단계에 대해 설명하겠지만, 마이그레이션에 필요한 파일과 콘텐츠가
마이그레이션에 대해 수동으로 생성하거나 추가할 수 있습니다
$ git clone https://github.com/google/guava.git && cd guava
$ git checkout v31.1
1. WORKSPACE 파일 만들기
프로젝트 루트에 WORKSPACE
라는 파일을 만듭니다. 프로젝트가
외부 종속 항목이 없으면 작업공간 파일이 비어 있을 수 있습니다.
프로젝트가
작업공간에서 다음과 같은 외부 종속 항목을 지정합니다.
파일에서 참조됩니다. 작업공간 파일의 외부 종속 항목 목록을 자동화하려면 다음 안내를 따르세요.
rules_jvm_external
를 사용합니다. 이 규칙 집합을 사용하는 방법에 대한 안내는 다음을 참조하세요.
README를 참조하세요.
Guava 프로젝트 예시: 외부 종속 항목
이 API의 외부 종속 항목을 나열할 수 있습니다.
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 파일 1개 만들기
이제 작업공간이 정의되었고 외부 종속 항목 (예:
해당) 목록에 있는 경우 프로젝트 방법을 설명하는 BUILD
파일을 만들어야 합니다.
빌드되어야 합니다 pom.xml
파일이 하나만 있는 Maven과 달리 Bazel은 여러 개의 파일을
BUILD
파일을 사용하여 프로젝트를 빌드합니다. 이러한 파일은 여러 빌드 대상을 지정합니다.
Bazel이 증분 빌드를 생성할 수 있습니다
BUILD
파일을 단계별로 추가합니다. 먼저 BUILD
파일 1개를 추가하세요.
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
: 대상에 의미 있는 이름을 지정합니다. 위의 예에서 표적을 '전부'라고 부릅니다.srcs
: globbing을 사용하여 프로젝트의 모든 .java 파일을 나열합니다.resources
: globbing을 사용하여 프로젝트의 모든 리소스를 나열합니다.deps
: 어떤 외부 종속 항목을 사용할지 결정해야 합니다. 프로젝트 요구사항을 나타냅니다 예를 들어 외부 IP 주소 목록을 생성한 경우generate_workspace
도구를 사용한 종속 항목java_library
는generated_java_libraries
매크로
자세한 내용은 이 최상위 BUILD 파일의 아래 예 Gava 프로젝트를 이전합니다
이제 프로젝트 루트에
BUILD
파일이 있으므로 다음을 빌드합니다. 확인할 수 있습니다 명령줄에서bazel build //:everything
를 사용하여 살펴보겠습니다이제 Bazel을 사용하여 프로젝트가 성공적으로 빌드되었습니다. 필요한 사항 프로젝트의 증분 빌드를 허용하기 위해
BUILD
파일을 더 추가합니다.
Guava 프로젝트 예시: BUILD 파일 1개로 시작
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
파일이 여러 개 있으면 빌드가 증가합니다.
다음과 같은 세부사항을 허용합니다.
- 프로젝트의 증분 빌드 증가
- 빌드의 병렬 실행이 늘어나고
- 향후 사용자를 위해 빌드의 유지 관리 용이성 개선
- 패키지 간 타겟의 공개 상태를 제어하여 구현 세부정보가 포함된 라이브러리와 같은 문제가 사용할 수 있습니다
BUILD
파일을 더 추가하기 위한 도움말:
- 각 자바 패키지에
BUILD
파일을 추가하여 시작할 수 있습니다. 시작 종속 항목이 가장 적고 자동 작업이 가능한 Java 패키지 종속 항목이 가장 많은 패키지에 최적화되어 있습니다 BUILD
파일을 추가하고 대상을 지정할 때 이러한 새 대상을 이를 사용하는 타겟의deps
섹션.glob()
는 함수는 패키지 경계를 넘지 않으므로 의 패키지 중glob()
와 일치하는 파일이 늘어나면 줄어듭니다.BUILD
파일을main
디렉터리에 추가할 때마다 상응하는test
디렉터리에BUILD
파일을 업로드합니다.- 패키지 간에 가시성을 적절하게 제한해야 합니다.
BUILD
파일 설정의 오류 문제를 간단하게 해결하려면 다음을 확인하세요. 각 빌드를 추가할 때 프로젝트가 Bazel로 계속 빌드됨 파일에서 참조됩니다.bazel build //...
를 실행하여 모든 타겟이 계속 빌드되도록 합니다.
4. Bazel을 사용하여 빌드
설정 유효성을 검사하기 위해 BUILD
파일을 추가하면서 Bazel을 사용하여 빌드했습니다.
확인할 수 있습니다
원하는 세부사항으로 BUILD
파일이 있는 경우 Bazel을 사용할 수 있습니다.
모든 빌드를 생성할 수 있습니다