Maven에서 Bazel로 마이그레이션

문제 신고 <ph type="x-smartling-placeholder"></ph> 소스 보기 1박 · 7.2 · 7.1 · 7.0 · 6.5 · 6.4

이 페이지에서는 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로 마이그레이션하는 방법을 설명합니다.

  1. WORKSPACE 파일 만들기
  2. BUILD 파일 하나 만들기
  3. 더 많은 BUILD 파일 만들기
  4. 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 파일을 추가하여 빌드를 미세 조정합니다. 있습니다

  1. WORKSPACE 파일과 동일한 디렉터리에서 텍스트 파일을 만들고 이름을 BUILD로 지정합니다.

  2. 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_librarygenerated_java_libraries 매크로
    • 자세한 내용은 이 최상위 BUILD 파일의 아래 예 Gava 프로젝트를 이전합니다

  3. 이제 프로젝트 루트에 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",
    ]),
    javacopts = ["-XepDisableAllChecks"],
    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을 사용할 수 있습니다. 모든 빌드를 생성할 수 있습니다